ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODFkMmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFhZmQ0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIxNmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmZmI1Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBBZGFwdGVycwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNlcnZlciBhZGFwdGVycyBmb3IgdXNlIHdpdGggdGhlIEpTVCBzZXJ2ZXIgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk4MDNkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdmVyc2lvbj0iMS4wLjEwMyIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4yMDQiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgdmVyc2lvbj0iMS4wLjEwMyIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkiIHZlcnNpb249IjMuMi4xMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB2ZXJzaW9uPSIxLjAuMjA0IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgdmVyc2lvbj0iMS4wLjEwMyIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iIHZlcnNpb249IjIuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHZlcnNpb249IjEuMC4yMDQiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIgdmVyc2lvbj0iMS4wLjEwMyIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4zMDQiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiB2ZXJzaW9uPSIxLjAuMzA1IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkiIHZlcnNpb249IjEuMC4zMDMiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiIHZlcnNpb249IjEuMC4yMDUiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpIiB2ZXJzaW9uPSIxLjAuMjA1IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIgdmVyc2lvbj0iMS4xLjEwMSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgdmVyc2lvbj0iMS4zLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuMy4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgdmVyc2lvbj0iMS4zLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiB2ZXJzaW9uPSIxLjAuMTAyIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiB2ZXJzaW9uPSIxLjAuMTAyIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSIgdmVyc2lvbj0iMS4wLjEwMiIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIiB2ZXJzaW9uPSIxLjAuMTAyIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdmVyc2lvbj0iMS4wLjEwMiIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0aiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmOWRiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQWRhcHRlcnNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAzNGQ5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBBZGFwdGVycyBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWU3MjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNDIzOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgQWRhcHRlcnMgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpTVCBTZXJ2ZXIgQWRhcHRlcnMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmOWRiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQWRhcHRlcnNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAzNGQ5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBBZGFwdGVycyBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjA5NzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1mZWF0dXJlcwotcGx1Z2lucwotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTY4M2EuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTI0MTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMGU1My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgQWRhcHRlciBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKU1Qgc2VydmVyIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzlmN2FiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODNiY2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZV8xLjAuMC4qLnppcAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmVfMS41LjAuKi56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTM1YmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMTZmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTE5NjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIHNlcnZlciBjb3JlIGZ1bmN0aW9uYWxpdHkKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZGZmMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIgdmVyc2lvbj0iMi4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuNi41IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIiB2ZXJzaW9uPSIzLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4zMDQiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdmVyc2lvbj0iMS4wLjEwMiIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4xMDIiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIiB2ZXJzaW9uPSIyLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY2FjdHVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGNkN2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1YWViYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ3ZmY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgU2VydmVyIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpTVCBTZXJ2ZXIgQ29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkY2Q3Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzVhZWJhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwOTcxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWIxZjE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNiMjY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5zb3VyY2UKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjMjRlMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIHNlcnZlciB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0ZGNlMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMzZmMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMTZmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODQ0Y2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1Qgc2VydmVyIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkMmY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRkMzQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIxNmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMmY3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBzZXJ2ZXIgVUkgZnVuY3Rpb25hbGl0eQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzQ1ZjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LnVpIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpIiB2ZXJzaW9uPSIzLjIuMTAwIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmZvcm1zIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4xMDMiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgdmVyc2lvbj0iMS4wLjEwMyIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4xMDMiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHZlcnNpb249IjEuMC4xMDIiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4xMDIiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiIHZlcnNpb249IjEuMC4xIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdmVyc2lvbj0iMS4wLjEwMiIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM5M2Q4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjZlNmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiODljMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFjODMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIHNlcnZlciBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM5M2Q4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjZlNmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJkNDc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmVfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcxOTYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzY0YWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1Qgc2VydmVyIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JlYmEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmYwOWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmRiN2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQWRhcHRlcnMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1TZXJ2ZXIgYWRhcHRlcnMgZm9yIHVzZSB3aXRoIHRoZSBXU1Qgc2VydmVyIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1NDdhOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciIHZlcnNpb249IjEuMC40IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4yMDQiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHZlcnNpb249IjEuMC4xMDMiIC8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgdmVyc2lvbj0iMS4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLm1vcnRiYXkuamV0dHkiIHZlcnNpb249IjUuMS4xMSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWU3MjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjZGZlZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQWRhcHRlcnMgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBTZXJ2ZXIgQWRhcHRlcnMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJhNjRjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIEFkYXB0ZXJzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5NTU5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI1Mjc1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBBZGFwdGVycyBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwOTcxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzcyM2ViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjcyNGFkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjMzZDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgU2VydmVyIEFkYXB0ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIHNlcnZlciB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1ZjIzYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzYzNmYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWY5YzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMTI4NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIiBkZWZhdWx0PSJidWlsZC51cGRhdGUuamFyIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmZWF0dXJlLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9mZWF0dXJlLnRlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmZWF0dXJlLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhbGwucGx1Z2lucyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBkaXI9Ii4uL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImFsbC5mZWF0dXJlcyIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1cGRhdGUuZmVhdHVyZSIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFsbC5jaGlsZHJlbiIgZGVwZW5kcz0iaW5pdCxhbGwuZmVhdHVyZXMsYWxsLnBsdWdpbnMsdXBkYXRlLmZlYXR1cmUiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGlsZHJlbiIgaWY9ImluY2x1ZGUuY2hpbGRyZW4iPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbC5jaGlsZHJlbiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5qYXJzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRoZSBqYXJzIGZvciB0aGUgZmVhdHVyZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLmphcnMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5zb3VyY2VzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnNvdXJjZXMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC56aXBzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnppcHMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC51cGRhdGUuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIGZlYXR1cmUgamFyIG9mOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaCBmb3IgYW4gdXBkYXRlIHNpdGUuIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnVwZGF0ZS5qYXIiLz4KLQkJPC9hbnRjYWxsPgotCQk8cHJvcGVydHkgbmFtZT0iZmVhdHVyZS5iYXNlIiB2YWx1ZT0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyIgaW5oZXJpdEFsbD0iZmFsc2UiPgotCQkJPHBhcmFtIG5hbWU9Im5sIiB2YWx1ZT0iKiIvPgotCQkJPHBhcmFtIG5hbWU9ImFyY2giIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0ib3MiIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0id3MiIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZmVhdHVyZS5iYXNlIiB2YWx1ZT0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8L2FudGNhbGw+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmphciIgYmFzZWRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmJpbi5wYXJ0cyIgZGVwZW5kcz0iaW5pdCIgaWY9ImZlYXR1cmUuYmFzZSI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjaGlsZHJlbiI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyLmJpbi5wYXJ0cyIvPgotCQkJPHBhcmFtIG5hbWU9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtmZWF0dXJlLmJhc2V9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0MiIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iZmVhdHVyZS54bWwsbGljZW5zZS5odG1sLGZlYXR1cmUucHJvcGVydGllcyxlcGwtdjEwLmh0bWwsZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIJCQkvPgotCQk8L2NvcHk+Ci0JCTxlY2xpcHNlLmlkUmVwbGFjZXIgZmVhdHVyZUZpbGVQYXRoPSIke2ZlYXR1cmUuYmFzZX0vZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyL2ZlYXR1cmUueG1sIiAgc2VsZlZlcnNpb249IjEuMC4wLjIwMDcwNTI0MTQ0MiIgZmVhdHVyZUlkcz0iIiBwbHVnaW5JZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwxLjAuMTA3LjIwMDcwNTI0MTQ0MiwiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXMke29zfV8ke3dzfV8ke2FyY2h9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXMqXypfKiI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNncm91cF9ncm91cF9ncm91cCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzKl8qXyoiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLmRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHppcCBjb250YWluaW5nIGFsbCB0aGUgcGx1Zy1pbnMgYW5kIGZlYXR1cmVzIGZvciB0aGUgZmVhdHVyZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guIj4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5iaW4ucGFydHMiPgotCQkJPHBhcmFtIG5hbWU9Im5sIiB2YWx1ZT0iKiIvPgotCQkJPHBhcmFtIG5hbWU9ImFyY2giIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0iaW5jbHVkZS5jaGlsZHJlbiIgdmFsdWU9InRydWUiLz4KLQkJCTxwYXJhbSBuYW1lPSJvcyIgdmFsdWU9IioiLz4KLQkJCTxwYXJhbSBuYW1lPSJ3cyIgdmFsdWU9IioiLz4KLQkJCTxwYXJhbSBuYW1lPSJmZWF0dXJlLmJhc2UiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPHppcCBkZXN0ZmlsZT0iJHtmZWF0dXJlLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIuYmluLmRpc3QuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9ImZhbHNlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLnNvdXJjZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJpbmNsdWRlLmNoaWxkcmVuIiB2YWx1ZT0idHJ1ZSIvPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5zb3VyY2VzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guc291cmNlXzEuMC4wLjIwMDcwNTI0MTQ0Mi9zcmMiLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5zcmMuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9InRydWUiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ6aXAubG9ncyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iIGluaGVyaXRBbGw9ImZhbHNlIj4KLQkJCTxwYXJhbSBuYW1lPSJpbmNsdWRlLmNoaWxkcmVuIiB2YWx1ZT0idHJ1ZSIvPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5sb2dzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5sb2cuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9InRydWUiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNsZWFuIHRoZSBmZWF0dXJlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaCBvZiBhbGwgdGhlIHppcHMsIGphcnMgYW5kIGxvZ3MgY3JlYXRlZC4iPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmphciIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmJpbi5kaXN0LnppcCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmxvZy56aXAiLz4KLQkJPGRlbGV0ZSBmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5zcmMuemlwIi8+Ci0JCTxkZWxldGUgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJjbGVhbiIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciIGRlc2NyaXB0aW9uPSJSZWZyZXNoIHRoaXMgZm9sZGVyLiI+Ci0JCTxlY2xpcHNlLmNvbnZlcnRQYXRoIGZpbGVTeXN0ZW1QYXRoPSJEOi9idWlsZHMvV29ya3NwYWNlcy9XVFAxNW1haW50ZW5hbmNlL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLyIgcHJvcGVydHk9InJlc291cmNlUGF0aCIvPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cmVzb3VyY2VQYXRofSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJyZWZyZXNoIi8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5zb3VyY2VzIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjaGlsZHJlbiI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyLnNvdXJjZXMiLz4KLQkJCTxwYXJhbSBuYW1lPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciIgdmFsdWU9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC5zb3VyY2VfMS4wLjAuMjAwNzA1MjQxNDQyL3NyYyIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5sb2dzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbC5jaGlsZHJlbiIgaW5oZXJpdEFsbD0iZmFsc2UiPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5sb2dzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NWEzNTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFNlcnZlciBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotQSBwYXRjaCBmb3IgU2VydmVyIHRvb2xzIGZyYW1ld29yayBjb3JlLiBcblwKLVRoaXMgcGF0Y2ggZml4ZXMgYSBwcm9ibGVtIHdpdGggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBpcyBhIGxhcmdlIG51bWJlciBvZiBwcm9qZWN0cyBcblwKLWluIGEgd29ya3NwYWNlLiBcblwKLVNlZSBidWcgMTg3MTg3IChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3MTg3KSkgXG4KLQotCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjYzZlYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IlBhdGNoIEZlYXR1cmUgZm9yIFNlcnZlciBDb3JlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNC52MjAwNzA0MTUwMTMzLS0tLS0xRzk1NUg1RzVFcCIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWZkN2RhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjE2Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjYwYTY0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNlcnZlciB0b29scyBmcmFtZXdvcmsgY29yZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlkMDRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGI5MWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJjOGIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViZjU4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFNlcnZlciBDb3JlIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgU2VydmVyIENvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGI5MWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJjOGIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGUzZjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1mZWF0dXJlcwotcGx1Z2lucwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjIyYzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzZjZTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlLCBmZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnNvdXJjZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OGQ2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgdGhlIFdTVCBzZXJ2ZXIgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YTZlZmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDQ0NTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlXzAuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI1NmNlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIxNmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViYjM4YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFNlcnZlciBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBTZXJ2ZXIgdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI1YWQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTJiMTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjE2Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU4ZWI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgU2VydmVyIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U2VydmVyIHRvb2xzIGZyYW1ld29yayBVSQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2MxYmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIiB2ZXJzaW9uPSIxLjAuMTAzIiAvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHZlcnNpb249IjEuMC4xMDMiIC8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDczOTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzljYTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5ZjgyYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUyMzBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFNlcnZlciBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFNlcnZlciBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ3Mzk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5Y2EyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNmQ1ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0Y2U0NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI3MTBlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIHNlcnZlciB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NjhmZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjUwNTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1zcmMuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlZjBiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wdWJsaXNoaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1ZTE3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTU6MzggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODZmODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDBiNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KYXZhIFNlcnZlciBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzPVJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5nPVJ1bnRpbWUgRmFjZXQgTWFwcGluZ3MKLWV4dGVuc2lvblBvaW50U2VydmVyUHJvZmlsZXJzPVNlcnZlciBQcm9maWxlcnMKLQotcnVudGltZVR5cGVOYW1lPUoyRUUgUnVudGltZSBMaWJyYXJ5Ci1ydW50aW1lVHlwZURlc2NyaXB0aW9uPUEgcnVudGltZSB0aGF0IHJlcHJlc2VudHMgYSBzZXQgb2YgSjJFRSBydW50aW1lIGxpYnJhcmllcy4KLQotbW9kdWxlVHlwZUoyRUVXZWJOYW1lPUoyRUUgV2ViIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFSkJOYW1lPUoyRUUgRUpCIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVSQVJOYW1lPUoyRUUgQ29ubmVjdG9yIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVDbGllbnROYW1lPUoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFQVJOYW1lPUoyRUUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotbW9kdWxlVHlwZUoyRUVVdGlsaXR5TmFtZT1KMkVFIFV0aWxpdHkgamFyCi0KLWxhdW5jaGFibGVKbmRpPUpOREkgT2JqZWN0Ci1sYXVuY2hhYmxlSm5kaURlc2NyaXB0aW9uPVNpbGVudGx5IHN0YXJ0IGFuIG9iamVjdCBsb2NhdGFibGUgYnkgSk5ESS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IxNzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVGYWNldE1hcHBpbmdzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5ncyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJQcm9maWxlcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclByb2ZpbGVycyIgc2NoZW1hPSJzY2hlbWEvc2VydmVyUHJvZmlsZXJzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSJpbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL2ludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5jb250YWluZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlVHlwZXMiPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFV2ViTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUpCTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFQ2xpZW50TmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFUkFSTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5lYXIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUFSTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlSjJFRVV0aWxpdHlOYW1lIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LioiCi0gICAgICAgICB2ZXJzaW9ucz0iKiIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KLSAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXQiCi0gICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNhY3R1cy5leHByZXNzaW9ucyIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIiCi0gICAgICBwcm9wZXJ0aWVzPSJpc1NlcnZsZXRUZXN0Q2FzZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNhY3R1cy5leHByZXNzaW9uIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4KLSAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubW9kdWxlQXJ0aWZhY3RBZGFwdGVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUiCi0gICAgICBwcmlvcml0eT0iMTAiPgotICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIvPgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgICAgICA8L29yPgotICAgICAgPC9lbmFibGVtZW50PgotICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubGF1bmNoYWJsZUFkYXB0ZXIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gICAgPGNsaWVudAotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuam5kaSIKLSAgICAgIG5hbWU9IiVsYXVuY2hhYmxlSm5kaSIKLSAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZUpuZGlEZXNjcmlwdGlvbiIKLSAgICAgIHByaW9yaXR5PSItMTAwIgotICAgICAgbGF1bmNoYWJsZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KMkVFTGF1bmNoYWJsZUNsaWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEsMy4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40LDUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIj4KLSAgICA8cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpSRVJ1bnRpbWVDb21wb25lbnRQcm92aWRlciIKLSAgICAgIHJ1bnRpbWVUeXBlSWRzPSIqIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIiLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDgxYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL2ludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZUNvbXBvbmVudFByb3ZpZGVycyIgbmFtZT0iUnVudGltZSBDb21wb25lbnQgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBleHBlcmltZW50YWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBkb3duc3RyZWFtIGNvbXBvbmVudHMuCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgbmV3IHJ1bnRpbWUgY29tcG9uZW50cyB0byBhbiBleGlzdGluZyBmYWNldCBydW50aW1lLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lQ29tcG9uZW50UHJvdmlkZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lQ29tcG9uZW50UHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lIHR5cGUgaWRzIHRoYXQgdGhpcyBwcm92aWRlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1SdW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41LjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzJnF1b3Q7Jmd0OwotICAgICAmbHQ7cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDb21wb25lbnRQcm92aWRlciZxdW90OwotICAgICAgICBydW50aW1lVHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLCBjb20uZXhhbXBsZTIuKiZxdW90OwotICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlUnVudGltZUNvbXBvbmVudFByb3ZpZGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlJmx0Oy9iJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGUwYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiIG5hbWU9IlJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIuIFJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycyBwcm92aWRlIHRoZSBjbGFzc3BhdGggZm9yIEphdmEgc2VydmVyIHJ1bnRpbWVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lIHR5cGUgaWRzIHRoYXQgdGhpcyBwcm92aWRlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1SdW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyZxdW90OyZndDsKLSAgICAgJmx0O3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsKLSAgICAgICAgcnVudGltZVR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSwgY29tLmV4YW1wbGUyLiomcXVvdDsKLSAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtiJmd0O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvYiZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRNYXBwaW5ncy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVGYWNldE1hcHBpbmdzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDMzMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVGYWNldE1hcHBpbmdzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lRmFjZXRNYXBwaW5ncyIgbmFtZT0iUnVudGltZSBGYWNldCBNYXBwaW5ncyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIG1hcCBiZXR3ZWVuIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgYW5kIGEgc2VydmVyIHJ1bnRpbWUgdHlwZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUZhY2V0TWFwcGluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVGYWNldE1hcHBpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJ1bnRpbWUgdHlwZSBpZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUtY29tcG9uZW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBmYWNldCBtYXBwaW5nIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MmcXVvdDsmZ3Q7Ci0gICAgICZsdDtydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OwotICAgICAgICBydW50aW1lVHlwZUlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuMzImcXVvdDsKLSAgICAgICAgcnVudGltZS1jb21wb25lbnQ9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OwotICAgICAgICB2ZXJzaW9uPSZxdW90OzMuMiZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDBiNDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJQcm9maWxlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgaWQ9InNlcnZlclByb2ZpbGVycyIgbmFtZT0iU2VydmVyIFByb2ZpbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBwcm9maWxpbmcgc2VydmVycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VydmVyUHJvZmlsZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJQcm9maWxlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRlZCBuYW1lCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjbGFzcyB0aGF0IGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQcm9maWxlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgcHJvZmlsZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJQcm9maWxlcnMmcXVvdDsmZ3Q7Ci0gICAgICZsdDtzZXJ2ZXJQcm9maWxlcgotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5teVByb2ZpbGVyJnF1b3Q7Ci0gICAgICAgIG5hbWU9JnF1b3Q7TXkgUHJvZmlsZXImcXVvdDsKLSAgICAgICAgdm1BcmdzPSZxdW90Oy1YcGlBZ2VudCZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9DbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9DbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmJiMDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGU7Ci0vKioKLSAqIEEgcnVudGltZSB0YXJnZXQgaGFuZGxlciB0aGF0IHN1cHBvcnRzIGNoYW5naW5nIHRoZSBjbGFzc3BhdGggb2YgdGhlCi0gKiBwcm9qZWN0IGJ5IGFkZGluZyBvbmUgb3IgbW9yZSBjbGFzc3BhdGggY29udGFpbmVycy4gUnVudGltZSBwcm92aWRlcnMKLSAqIGNhbiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2RzIHRvIHByb3ZpZGUKLSAqIHRoZSBjb3JyZWN0IGJ1aWxkIHBhdGggZm9yIHRoZWlyIHJ1bnRpbWUgdHlwZS4KLSAqIAotICogQGRlcHJlY2F0ZWQgU2hvdWxkIHVzZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycwotICogICAgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSB7Ci0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIFJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUjc2V0UnVudGltZVRhcmdldChJUHJvamVjdCwgSVJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlI3JlbW92ZVJ1bnRpbWVUYXJnZXQoSVByb2plY3QsIElSdW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJ1bnRpbWVUYXJnZXQoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBlbnRyaWVzIHRvIHRoZSBnaXZlbiBsaXN0IGZvciBldmVyeSBqYXIgZmlsZSBmb3VuZCBpbiB0aGUKLQkgKiBnaXZlbiBkaXJlY3RvcnkuIE9wdGlvbmFsbHkgc2VhcmNoIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIGxpc3QgYSBsaXN0Ci0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBpbmNsdWRlU3ViZGlyZWN0b3JpZXMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jbHVkZSBzdWJkaXJlY3RvcmllcywgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRMaWJyYXJ5RW50cmllcyhMaXN0IGxpc3QsIEZpbGUgZGlyLCBib29sZWFuIGluY2x1ZGVTdWJkaXJlY3RvcmllcykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZHMgZm9yIHRoaXMgcnVudGltZSB0YXJnZXQgaGFuZGxlci4gVGhlc2UKLQkgKiBpZHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBpZCB0byBjcmVhdGUgYSBuZXcgZnVsbHkKLQkgKiBxdWFsaWZpZWQgY2xhc3NwYXRoIGNvbnRhaW5lciBpZC4KLQkgKiA8cD4KLQkgKiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBhIHNpbmdsZSBjbGFzc3BhdGggZW50cnkgZm9yIHRoZSBydW50aW1lLCB3aXRoIG5vCi0JICogZXh0cmEgaWQgKDxjb2RlPm5ldyBTdHJpbmdbMV08L2NvZGU+KS4gVG8gY3JlYXRlIG11bHRpcGxlIGlkcywganVzdAotCSAqIHJldHVybiBhIHN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSBpZHMuIEZvciBpbnN0YW5jZSwgdG8gaGF2ZSB0d28KLQkgKiBjbGFzc3BhdGggY29udGFpbmVycyB3aXRoIGlkcyAiaWQxIiBhbmQgImlkMiIsIHVzZQotCSAqIDxjb2RlPm5ldyBTdHJpbmdbXSB7ICJpZDEiLCAiaWQyIiB9PC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyeSBpZHMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IHRoYXQgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBydW50aW1lIGFuZCBpZCBiZSB1cGRhdGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSBlbnRyaWVzIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgbGFiZWwgZm9yIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBUaGlzIG1ldGhvZAotCSAqIG11c3Qgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBsYWJlbCBmb3IKLQkgKiBAcGFyYW0gaWQgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZAotCSAqIEByZXR1cm4gYSBjbGFzc3BhdGggY29udGFpbmVyIGxhYmVsCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJMYWJlbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcGFyYW0gaWQgYSBjb250YWluZXIgaWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyAoY3JlYXRlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yKSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciB3aXRoCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tCi0JICogZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIElmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqIChmb3IgaW5zdGFuY2UsIGlmIHRoZSBydW50aW1lIGRvZXMgbm90IGV4aXN0KSwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGZvcgotCSAqIEBwYXJhbSBpZCB0aGUgY2xhc3NwYXRoIGVudHJ5IGlkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGNvbnRhaW5lciwgb3IgbnVsbCBpZiB0aGUKLQkgKiAgIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9FSkJCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhNjI3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotLyoqCi0gKiBBbiBFSkIgYmVhbi4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRUpCQmVhbiBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8xMSA9ICIxLjEiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMCA9ICIyLjAiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMSA9ICIyLjEiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8zMCA9ICIzLjAiOwotCQotCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBsb2NhbDsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3RlOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRUpCQmVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCB0aGUgRUpCIGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIKLQkgKiBAcGFyYW0gcmVtb3RlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBsb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBFSkJCZWFuKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgam5kaU5hbWUsIGJvb2xlYW4gcmVtb3RlLCBib29sZWFuIGxvY2FsKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKLQkJdGhpcy5yZW1vdGUgPSByZW1vdGU7Ci0JCXRoaXMubG9jYWwgPSBsb2NhbDsKLQkJdGhpcy52ZXJzaW9uID0gIjIuMSI7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBFSkJCZWFuIHdpdGggYSBzcGVjaWZpYyB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIEVKQiBpcyBjb250YWluZWQgaW4KLQkgKiBAcGFyYW0gam5kaU5hbWUgdGhlIEpOREkgbmFtZSBvZiB0aGUgRUpCCi0JICogQHBhcmFtIHJlbW90ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIHJlbW90ZSBpbnRlcmZhY2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbG9jYWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gdmVyc2lvbiB0aGUgbGV2ZWwgb2YgdGhlIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhpcyBFSkIgdXNlcy4gVXNlIG9uZSBvZiB0aGUgPGNvZGU+RUpCX3h4PC9jb2RlPiBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIEVKQkJlYW59Ci0JICovCi0JcHVibGljIEVKQkJlYW4oSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBqbmRpTmFtZSwgYm9vbGVhbiByZW1vdGUsIGJvb2xlYW4gbG9jYWwsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKLQkJdGhpcy5yZW1vdGUgPSByZW1vdGU7Ci0JCXRoaXMubG9jYWwgPSBsb2NhbDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgRUpCQmVhbi4KLQkgKi8KLQlwdWJsaWMgRUpCQmVhbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sm5kaU5hbWUoKSB7Ci0JCXJldHVybiBqbmRpTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTG9jYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgotCSAqCi0JICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RFSkIsIGpuZGlOYW1lLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgcykgewotCQlpbnQgaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQlzdXBlci5kZXNlcmlhbGl6ZShzLnN1YnN0cmluZygwLCBpbmQpKTsKLQkJaWYgKCdUJyA9PSBzLmNoYXJBdChpbmQrMikpCi0JCQlsb2NhbCA9IHRydWU7Ci0JCWVsc2UKLQkJCWxvY2FsID0gZmFsc2U7Ci0JCWlmICgnVCcgPT0gcy5jaGFyQXQoaW5kKzMpKQotCQkJcmVtb3RlID0gdHJ1ZTsKLQkJZWxzZQotCQkJcmVtb3RlID0gZmFsc2U7Ci0JCWpuZGlOYW1lID0gcy5zdWJzdHJpbmcoaW5kKzQpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI3NlcmlhbGl6ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuc2VyaWFsaXplKCkpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCWlmIChsb2NhbCkKLQkJCXNiLmFwcGVuZCgiVCIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoIkYiKTsKLQkJaWYgKHJlbW90ZSkKLQkJCXNiLmFwcGVuZCgiVCIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoIkYiKTsKLQkJc2IuYXBwZW5kKGpuZGlOYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0ZhY2V0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFkYzc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGZhY2V0IHJ1bnRpbWVzIGFuZCBzZXJ2ZXIgcnVudGltZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldFV0aWwgewotCS8qKgotCSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIC0gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEZhY2V0VXRpbCgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIGZhY2V0IHJ1bnRpbWUsIG9yIG51bGwKLQkgKiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgZmFjZXQgcnVudGltZQotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZhY2V0IHJ1bnRpbWUsIG9yCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLkZhY2V0VXRpbC5nZXRSdW50aW1lKHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY2V0IHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNlcnZlciBydW50aW1lLCBvciBudWxsCi0JICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHJldHVybiB0aGUgZmFjZXQgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2ZXIgcnVudGltZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBnZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHMuRmFjZXRVdGlsLmdldFJ1bnRpbWUocnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgZmFjZXRzIG9uIGEgcHJvamVjdCBhcmUgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gc2VydmVyLiBSZXR1cm5zCi0JICogYW4gT0sgc3RhdHVzIGlmIHRoZSBzZXJ2ZXIncyBydW50aW1lIHN1cHBvcnRzIHRoZSBwcm9qZWN0J3MgZmFjZXRzLCBhbmQgYW4KLQkgKiBFUlJPUiBzdGF0dXMgKHdpdGggbWVzc2FnZSkgaWYgaXQgZG9lc24ndC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBPSyBzdGF0dXMgaWYgdGhlIHNlcnZlcidzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHByb2plY3QncyBmYWNldHMsIGFuZCBhbgotCSAqICAgIEVSUk9SIHN0YXR1cyAod2l0aCBtZXNzYWdlKSBpZiBpdCBkb2Vzbid0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHZlcmlmeUZhY2V0cyhJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWwudmVyaWZ5RmFjZXRzKHByb2plY3QsIHNlcnZlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lBcHBsaWNhdGlvbkNsaWVudE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU3MGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBBIEoyRUUgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZS4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKLQkvLyBpbnRlbnRpb25hbGx5IGVtcHR5Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQ29ubmVjdG9yTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lDb25uZWN0b3JNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNjcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lDb25uZWN0b3JNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEEgSjJFRSBjb25uZWN0b3IgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3Rvck1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggYXMgYW4gYXJyYXkgb2YgYWJzb2x1dGUgSVBhdGhzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSVBhdGhbXSBnZXRDbGFzc3BhdGgoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFSkJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjEwNjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgRUpCIG1vZHVsZS4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJNb2R1bGUgZXh0ZW5kcyBJSjJFRU1vZHVsZSB7Ci0JLy8gaW50ZW50aW9uYWxseSBlbXB0eQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVudGVycHJpc2VBcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTFkNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiAoRUFSIGZpbGUpLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVudGVycHJpc2VBcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlcyBjb250YWluZWQgd2l0aGluIHRoaXMgRUFSLiBUaGUgcmV0dXJuZWQgbW9kdWxlcyB3aWxsCi0JICogZWl0aGVyIGJlIEoyRUUgbW9kdWxlcyAod2hpY2ggd2lsbCBiZSBhZGFwdGFibGUgdG8gSUoyRUVNb2R1bGUpIG9yCi0JICogdXRpbGl0eSBqYXJzIGNvbnRhaW5lZCBpbiB0aGUgRUFSLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBnaXZlbiBtb2R1bGUgd2l0aGluIHRoaXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCi0JICogQHJldHVybiB0aGUgVVJJIG9mIHRoZSBnaXZlbiBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBVUkkgY291bGQKLQkgKiAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSShJTW9kdWxlIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkOTc0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKMkVFTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogQSBKMkVFIG1vZHVsZSB0aGF0IGNhbiBiZSBkZXBsb3llZCB0byBhIHNlcnZlci4KLSAqIAotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVNb2R1bGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGlzIG1vZHVsZS4gUmV0dXJucyBhbiBlbXB0eQotCSAqIGFycmF5IGlmIHRoaXMgaXMgYSBiaW5hcnkgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiByZXNvdXJjZSBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBjb250YWluaW5nIEphdmEgb3V0cHV0IGluIHRoaXMgbW9kdWxlLiBSZXR1cm5zIGFuCi0JICogZW1wdHkgYXJyYXkgaWYgdGhpcyBpcyBhIGJpbmFyeSBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIEphdmEgb3V0cHV0IGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldEphdmFPdXRwdXRGb2xkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGJpbmFyeSAoemlwcGVkKSBtb2R1bGUsIGFuZAotCSAqIGZhbHNlIGlmIGl0IGlzIGV4cGFuZGVkLgotCSAqIAotCSAqIDxwPklmIHRydWUsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIG9ubHkgYSBzaW5nbGUgZWxlbWVudCAtCi0JICogdGhlIGJpbmFyeSAoamFyIG9yIHppcCBmaWxlKSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZgotCSAqIHRoaXMgbW9kdWxlLiAoYSBzaW5nbGUgSU1vZHVsZVJlc291cmNlLCBlLmcuCi0JICogbXllamIuamFyKSBBbHNvLCBnZXRMb2NhdGlvbigpIHNob3VsZCByZXR1cm4gdGhlIGZ1bGwgcGF0aAotCSAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGJpbmFyeSBpdHNlbGYuIChlLmcuCi0JICogYzpcdGVtcFxteWVqYi5qYXIpPC9wPgotCSAqIAotCSAqIDxwPklmIGZhbHNlLCBtZW1iZXJzKCkgc2hvdWxkIHJldHVybiB0aGUgZW50aXJlIGNvbnRlbnRzCi0JICogb2YgdGhlIG1vZHVsZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuIFRoZXJlIHNob3VsZCBiZSBubwotCSAqIHByZWNlZWRpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gKGFuIGFycmF5IG9mCi0JICogSU1vZHVsZVJlc291cmNlcywgZS5nLiBpbmRleC5odG1sLCBXRUItSU5GL3dlYi54bWwsCi0JICogLi4uKSBJbiB0aGlzIGNhc2UsIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgcGF0aCB0bwotCSAqIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZXNlIHJlc291cmNlcy48L3A+Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSmF2YVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1MTY5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHNlcnZlciB0aGF0IGNvbnRhaW5zIGEgSmF2YSBydW50aW1lLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVJ1bnRpbWUgewotCS8qKgotCSAqIFJldHVybiB0aGUgVk0gaW5zdGFsbCAoaW5zdGFsbGVkIEpSRSkgdGhhdCB0aGlzIHJ1bnRpbWUgaXMgdXNpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBWTSBpbnN0YWxsCi0JICovCi0JcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nRGVmYXVsdEpSRSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjNjI3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgc2VydmVyIHRoYXQgY29udGFpbnMgYSBKYXZhIHJ1bnRpbWUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSUphdmFSdW50aW1lIHsKLQkvKioKLQkgKiBTZXQgdGhlIFZNIGluc3RhbGwgKGluc3RhbGxlZCBKUkUpIHRoYXQgdGhpcyBydW50aW1lIGlzIHVzaW5nLgotCSAqIFVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIEVjbGlwc2UgZGVmYXVsdCBKUkUuCi0JICogCi0JICogQHBhcmFtIHZtSW5zdGFsbCB0aGUgVk0gaW5zdGFsbCB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxM2Y2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lVdGlsaXR5TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogQSBKMkVFIHV0aWxpdHkgbW9kdWxlIHRoYXQgY2FuIGJlIGRlcGxveWVkIHRvIGEgc2VydmVyLgotICogCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXRpbGl0eU1vZHVsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiByZXNvdXJjZSBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBjb250YWluaW5nIEphdmEgb3V0cHV0IGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBKYXZhIG91dHB1dCBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBiaW5hcnkgKHppcHBlZCkgbW9kdWxlLCBhbmQKLQkgKiBmYWxzZSBpZiBpdCBpcyBleHBhbmRlZC4KLQkgKiAKLQkgKiA8cD5JZiB0cnVlLCBtZW1iZXJzKCkgc2hvdWxkIHJldHVybiBvbmx5IGEgc2luZ2xlIGVsZW1lbnQgLQotCSAqIHRoZSBiaW5hcnkgKGphciBvciB6aXAgZmlsZSkgdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YKLQkgKiB0aGlzIG1vZHVsZS4gKGEgc2luZ2xlIElNb2R1bGVSZXNvdXJjZSwgZS5nLgotCSAqIG15ZWpiLmphcikgQWxzbywgZ2V0TG9jYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBmdWxsIHBhdGgKLQkgKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBiaW5hcnkgaXRzZWxmLiAoZS5nLgotCSAqIGM6XHRlbXBcbXllamIuamFyKTwvcD4KLQkgKiAKLQkgKiA8cD5JZiBmYWxzZSwgbWVtYmVycygpIHNob3VsZCByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50cwotCSAqIG9mIHRoZSBtb2R1bGUsIHN0YXJ0aW5nIGF0IHRoZSByb290LiBUaGVyZSBzaG91bGQgYmUgbm8KLQkgKiBwcmVjZWVkaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIChhbiBhcnJheSBvZgotCSAqIElNb2R1bGVSZXNvdXJjZXMsIGUuZy4gaW5kZXguaHRtbCwgV0VCLUlORi93ZWIueG1sLAotCSAqIC4uLikgSW4gdGhpcyBjYXNlLCBnZXRMb2NhdGlvbigpIHNob3VsZCByZXR1cm4gdGhlIHBhdGggdG8KLQkgKiB0aGUgcm9vdCBmb2xkZXIgY29udGFpbmluZyB0aGVzZSByZXNvdXJjZXMuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JV2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyMjA2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogQSBKMkVFIHdlYiBtb2R1bGUuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViTW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKTsKLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGV4dCByb290IG9mIHRoZSBtb2R1bGUuIElmIHRoZSB0aGUgd2ViTW9kdWxlIGJlbG9uZ3MgdG8gYW4gZWFyTW9kdWxlLCB0aGUgY29udGV4dCByb290IHdpdGggaGlnaGVyCi0JICogcHJlc2VkZW5jZSB3aWxsIGJlIHJldHVybmVkLiAgIAotCSAqIAotCSAqIEBwYXJhbSBlYXJNb2R1bGUgVGhlIEVBUk1vZHVsZSBpZiBleGlzdCwgaWYgbm90IG51bGwKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KElNb2R1bGUgZWFyTW9kdWxlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1dGlsaXR5IG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFdBUi4KLQkgKgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBnaXZlbiBjb250YWluZWQgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIFVSSSBvZiB0aGUgZ2l2ZW4gbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgVVJJIGNvdWxkCi0JICogICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoSU1vZHVsZSBtb2R1bGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MzA0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlMYXVuY2hhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGluIEpOREkgdGhhdCBjYW4gYmUgdGVzdGVkIG9uIGEgc2VydmVyLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKbmRpTGF1bmNoYWJsZSB7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzOwotCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IGlzIGxhdW5jaGFibGUgdmlhIEpOREkuCi0JICogCi0JICogQHBhcmFtIHByb3BzIHRoZSBKTkRJIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBKbmRpTGF1bmNoYWJsZShQcm9wZXJ0aWVzIHByb3BzLCBTdHJpbmcgam5kaU5hbWUpIHsKLQkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOwotCQl0aGlzLnByb3BzID0gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSk5ESSBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbm5lY3QgdG8gdGhlIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKTkRJIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZSgpIHsKLQkJcmV0dXJuIGpuZGlOYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDJlOTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW4gSk5ESSB0aGF0IGNhbiBiZSB0ZXN0ZWQgb24gYSBzZXJ2ZXIuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGNsYXNzIEpuZGlPYmplY3QgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlIHsKLQlwcml2YXRlIFN0cmluZyBqbmRpTmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgaW4gSk5ESS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCB0aGUgb2JqZWN0IGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSm5kaU9iamVjdChJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGpuZGlOYW1lKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gZW1wdHkgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBKTkRJLgotCSAqLwotCXB1YmxpYyBKbmRpT2JqZWN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpuZGlOYW1lKCkgewotCQlyZXR1cm4gam5kaU5hbWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RKTkRJLCBqbmRpTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZGVzZXJpYWxpemUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzKSB7Ci0JCWludCBpbmQgPSBzLmluZGV4T2YoIi8vIik7Ci0JCXN1cGVyLmRlc2VyaWFsaXplKHMuc3Vic3RyaW5nKDAsIGluZCkpOwotCQlqbmRpTmFtZSA9IHMuc3Vic3RyaW5nKGluZCsyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNzZXJpYWxpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnNlcmlhbGl6ZSgpKTsKLQkJc2IuYXBwZW5kKCIvLyIpOwotCQlzYi5hcHBlbmQoam5kaU5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9QdWJsaXNoVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9QdWJsaXNoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRhMTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUHVibGlzaFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBmaWxlIG1ldGhvZHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBBZG9wdGVycyBzaG91bGQgdXNlIHRoZSBlcXVpdmFsZW50IGNsYXNzIGluCi0gKiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbCBpbnN0ZWFkLiBUaGlzIGNsYXNzIHdpbGwgZXZlbnR1YWxseQotICogYmUgZGVwcmVjYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFB1Ymxpc2hVdGlsIHsKLQkvLyBzaXplIG9mIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gNjU1MzY7Ci0KLQkvLyB0aGUgYnVmZmVyCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl07Ci0KLQkvKioKLQkgKiBQdWJsaXNoVXRpbCBjYW5ub3QgYmUgY3JlYXRlZC4gVXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgUHVibGlzaFV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBmaWxlIGZyb20gYSB0byBiLiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSBhZnRlciB1c2UuCi0JICoKLQkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGRlcHJlY2F0ZWQgVW51c2VkIC0gd2lsbCBiZSByZW1vdmVkLgotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29weUZpbGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyB0bykgewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0byk7Ci0JCQkKLQkJCWludCBhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCXdoaWxlIChhdmFpbCA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmLCAwLCBhdmFpbCk7Ci0JCQkJYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIG5ldyBTdHJpbmdbXSB7dG8sIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTbWFydCBjb3B5IHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgYSBzaW5nbGUgZXJyb3IgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZS4gVXNlIHB1Ymxpc2hTbWFydCgpIGluc3RlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNtYXJ0Q29weShJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaFNtYXJ0KHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubGVuZ3RoID4gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgb25seSByZXR1cm5zIGEgc2luZ2xlIGVycm9yIGluIHRoZSBjYXNlIG9mIGZhaWx1cmUuIFVzZSBwdWJsaXNoRGVsdGEoKSBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVEZWx0YShpbnQga2luZCwgSVBhdGggcGF0aCwgSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLnB1Ymxpc2hEZWx0YShkZWx0YSwgcGF0aCwgbnVsbCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubGVuZ3RoID4gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBkZXByZWNhdGVkIGRvZXMgbm90IGZhaWwgb3IgcmV0dXJuIHN0YXR1cyBpZiBkZWxldGUgZG9lc24ndCB3b3JrCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSVBhdGggcGF0aCwgSU1vZHVsZUZpbGUgZmlsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiRGVsZXRpbmc6ICIgKyBmaWxlLmdldE5hbWUoKSArICIgZnJvbSAiICsgcGF0aC50b1N0cmluZygpKTsKLQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOwotCQlwYXRoMi50b0ZpbGUoKS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgYSBzaW5nbGUgZXJyb3IgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZS4gVXNlIHB1Ymxpc2hGdWxsKCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaEZ1bGwocmVzb3VyY2VzLCBwYXRoLCBudWxsKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5sZW5ndGggPiAwKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMuIERlbGV0ZXMgdGhlIGV4aXN0aW5nIGZpbGUKLQkgKiAoYW5kIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IG9uZSkgaWYgcmVzb3VyY2VzIGlzIG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEBwYXJhbSB6aXBQYXRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVppcEZpbGUoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCB6aXBQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoWmlwKHJlc291cmNlcywgemlwUGF0aCwgbnVsbCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubGVuZ3RoID4gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gcmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeShkaXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzb3VyY2VzLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBkZWx0YSBwdWJsaXNoLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSBhIG1vZHVsZSByZXNvdXJjZSBkZWx0YQotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hEZWx0YShJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLnB1Ymxpc2hEZWx0YShkZWx0YSwgcGF0aCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwucHVibGlzaERlbHRhKGRlbHRhLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRnVsbChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwucHVibGlzaEZ1bGwocmVzb3VyY2VzLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMuIERlbGV0ZXMgdGhlIGV4aXN0aW5nIGZpbGUKLQkgKiAoYW5kIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IG9uZSkgaWYgcmVzb3VyY2VzIGlzIG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggd2hlcmUgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBjcmVhdGVkIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaFppcChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwucHVibGlzaFppcChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZWEyYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogQSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBwcm92aWRlcyB0aGUgY2xhc3NwYXRoIGZvciBhIEphdmEgc2VydmVyIHJ1bnRpbWUuCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHNjb3BlZCBieSBydW50aW1lIHR5cGUgYW5kIG1heSBwcm92aWRlIHRoZSBjbGFzc3BhdGggZm9yIG11bHRpcGxlCi0gKiBydW50aW1lIGluc3RhbmNlcy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgY2xhc3MgU291cmNlQXR0YWNobWVudFVwZGF0ZSB7Ci0JCVN0cmluZyBydW50aW1lSWQ7Ci0JCUlQYXRoIGVudHJ5OwotCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKLQkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cmlidXRlczsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U291cmNlQXR0YWNobWVudFVwZGF0ZT4gc291cmNlQXR0YWNobWVudHM7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JZDsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgSVBhdGg+IHJ1bnRpbWVQYXRoTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUGF0aD4oKTsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgSUNsYXNzcGF0aEVudHJ5W10+IHByZXZpb3VzQ2xhc3NwYXRoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ2xhc3NwYXRoRW50cnlbXT4oKTsKLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgY2xhc3NwYXRoIHByb3ZpZGVyIHdpdGggaXRzIGxpZmUtbG9uZyBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGlkKSB7Ci0JCWV4dGVuc2lvbklkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgKGNyZWF0ZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvcikgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgd2l0aAotCSAqIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBpZCAocmV0dXJuZWQgZnJvbQotCSAqIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBJZiB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzb2x2ZWQKLQkgKiAoZm9yIGluc3RhbmNlLCBpZiB0aGUgcnVudGltZSBkb2VzIG5vdCBleGlzdCksIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBmb3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgY29udGFpbmVyLCBvciBudWxsIGlmIHRoZQotCSAqICAgY29udGFpbmVyIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotCSAqIEBkZXByZWNhdGVkIHVzZSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0LCBJUnVudGltZSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgKGNyZWF0ZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvcikgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgd2l0aAotCSAqIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBpZCAocmV0dXJuZWQgZnJvbQotCSAqIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBJZiB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzb2x2ZWQKLQkgKiAoZm9yIGluc3RhbmNlLCBpZiB0aGUgcnVudGltZSBkb2VzIG5vdCBleGlzdCksIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJlc29sdmUKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgZm9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGNvbnRhaW5lciwgb3IgbnVsbCBpZiB0aGUKLQkgKiAgIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIHVzZSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUHJvamVjdCwgSVJ1bnRpbWUpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwobnVsbCwgcnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCXJ1bnRpbWVQYXRoTWFwLnB1dChydW50aW1lLmdldElkKCksIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKHByb2plY3QsIHJ1bnRpbWUpOwotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJZW50cmllcyA9IHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIocnVudGltZSk7Ci0JCQotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQotCQlpZiAoc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJCi0JCWludCBzaXplID0gZW50cmllcy5sZW5ndGg7Ci0JCWludCBzaXplMiA9IHNvdXJjZUF0dGFjaG1lbnRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCVNvdXJjZUF0dGFjaG1lbnRVcGRhdGUgc2F1ID0gc291cmNlQXR0YWNobWVudHMuZ2V0KGopOwotCQkJCWlmIChzYXUucnVudGltZUlkLmVxdWFscyhydW50aW1lLmdldElkKCkpICYmIHNhdS5lbnRyeS5lcXVhbHMoZW50cmllc1tpXS5nZXRQYXRoKCkpKSB7Ci0JCQkJCWVudHJpZXNbaV0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZW50cmllc1tpXS5nZXRQYXRoKCksIHNhdS5zb3VyY2VBdHRhY2htZW50UGF0aCwgc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgbmV3IElBY2Nlc3NSdWxlWzBdLCBzYXUuYXR0cmlidXRlcywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIGtleSA9IHByb2plY3QuZ2V0TmFtZSgpICsgIi8iICsgcnVudGltZS5nZXRJZCgpOwotCQlpZiAoIXByZXZpb3VzQ2xhc3NwYXRoLmNvbnRhaW5zS2V5KGtleSkpCi0JCQlwcmV2aW91c0NsYXNzcGF0aC5wdXQoa2V5LCBlbnRyaWVzKTsKLQkJZWxzZSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBwcmV2aW91c0VudHJpZXMgPSBwcmV2aW91c0NsYXNzcGF0aC5nZXQoa2V5KTsKLQkJCQotCQkJaWYgKChwcmV2aW91c0VudHJpZXMgPT0gbnVsbCkgfHwgKHByZXZpb3VzRW50cmllcy5sZW5ndGggIT0gZW50cmllcy5sZW5ndGgpKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xhc3NwYXRoIHVwZGF0ZTogIiArIGtleSArICIgIiArIGVudHJpZXMpOwotCQkJCXByZXZpb3VzQ2xhc3NwYXRoLnB1dChrZXksIGVudHJpZXMpOwotCQkJCQotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLlNFUlZFUl9DT05UQUlORVIpOwotCQkJCXBhdGggPSBwYXRoLmFwcGVuZChleHRlbnNpb25JZCkuYXBwZW5kKHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIocGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgamF2YVByb2plY3QgfSwKLQkJCQkJCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgbnVsbCB9LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgdXBkYXRpbmcgY2xhc3NwYXRoIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZW50cmllczsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgaW4gdGhlIHJ1bnRpbWUgc2luY2UgdGhlIGxhc3QgdGltZSB0aGF0IHRoZQotCSAqIGNsYXNzcGF0aCB3YXMgcmVzb2x2ZWQgd2hpY2ggbWF5IGFmZmVjdCB0aGUgY2xhc3NwYXRoLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBUaGlzCi0JICogbWV0aG9kIGlzIHVzZWQgdG8gY2hlY2sgcHJvamVjdHMgd2hlbiBhIHJ1bnRpbWUgY2hhbmdlcyBhbmQgYXV0b21hdGljYWxseSByZWJ1aWxkCi0JICogdGhlbSBpZiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIG1heSBjaGFuZ2UgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSBydW50aW1lLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gcnVudGltZVBhdGhNYXAuZ2V0KHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQlyZXR1cm4gKHBhdGggIT0gbnVsbCAmJiAhcGF0aC5lcXVhbHMocnVudGltZS5nZXRMb2NhdGlvbigpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlcyhGaWxlIGRpciwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGxpc3QsIGJvb2xlYW4gaW5jbHVkZVN1YmRpcmVjdG9yaWVzKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWlmIChpbmNsdWRlU3ViZGlyZWN0b3JpZXMpCi0JCQlkZXB0aCA9IDI7Ci0JCWFkZEphckZpbGVzKGRpciwgbGlzdCwgZGVwdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSmFyRmlsZXMoRmlsZSBkaXIsIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0LCBpbnQgZGVwdGgpIHsKLQkJaWYgKGRpciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZGVwdGggPiAwKSB7Ci0JCQkJCWFkZEphckZpbGVzKGZpbGUsIGxpc3QsIGRlcHRoIC0gMSk7Ci0JCQkJfSBlbHNlIGlmIChmaWxlLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLnppcCIpKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJbGlzdC5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBlbnRyaWVzIHRvIHRoZSBnaXZlbiBsaXN0IGZvciBldmVyeSBqYXIgZmlsZSBmb3VuZCBpbiB0aGUKLQkgKiBnaXZlbiBkaXJlY3RvcnkuIE9wdGlvbmFsbHkgc2VhcmNoIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIGxpc3QgYSBsaXN0Ci0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBpbmNsdWRlU3ViZGlyZWN0b3JpZXMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jbHVkZSBzdWJkaXJlY3RvcmllcywgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRMaWJyYXJ5RW50cmllcyhMaXN0PElDbGFzc3BhdGhFbnRyeT4gbGlzdCwgRmlsZSBkaXIsIGJvb2xlYW4gaW5jbHVkZVN1YmRpcmVjdG9yaWVzKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJYWRkSmFyRmlsZXMoZGlyLCBsaXN0LCBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIGlkIGJlIHVwZGF0ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHBhcmFtIGVudHJpZXMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc2F2ZSB0aGUgc291cmNlIHBhdGggZW50cmllcwotCQlpZiAocnVudGltZSA9PSBudWxsIHx8IGVudHJpZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGZpbmQgdGhlIHNvdXJjZSBhdHRhY2htZW50cwotCQlzb3VyY2VBdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3Q8U291cmNlQXR0YWNobWVudFVwZGF0ZT4oKTsKLQkJCi0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgIT0gbnVsbCB8fCBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7Ci0JCQkJU291cmNlQXR0YWNobWVudFVwZGF0ZSBzYXUgPSBuZXcgU291cmNlQXR0YWNobWVudFVwZGF0ZSgpOwotCQkJCXNhdS5ydW50aW1lSWQgPSBydW50aW1lLmdldElkKCk7Ci0JCQkJc2F1LmVudHJ5ID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCXNhdS5zb3VyY2VBdHRhY2htZW50UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotCQkJCXNhdS5hdHRyaWJ1dGVzID0gZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0JCQkJc291cmNlQXR0YWNobWVudHMuYWRkKHNhdSk7Ci0JCQl9Ci0JCX0KLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgc291cmNlIGF0dGFjaG1lbnQgaW5mby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZCgpIHsKLQkJc291cmNlQXR0YWNobWVudHMgPSBuZXcgQXJyYXlMaXN0PFNvdXJjZUF0dGFjaG1lbnRVcGRhdGU+KCk7Ci0JCQotCQlTdHJpbmcgaWQgPSBleHRlbnNpb25JZDsKLQkJU3RyaW5nIGZpbGVuYW1lID0gSmF2YVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoaWQgKyAiLnhtbCIpLnRvT1NTdHJpbmcoKTsKLQkJaWYgKCEobmV3IEZpbGUoZmlsZW5hbWUpKS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhmaWxlbmFtZSk7Ci0JCQkKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJzb3VyY2UtYXR0YWNobWVudCIpOwotCQkJZm9yIChJTWVtZW50byBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU291cmNlQXR0YWNobWVudFVwZGF0ZSBzYXUgPSBuZXcgU291cmNlQXR0YWNobWVudFVwZGF0ZSgpOwotCQkJCQlzYXUucnVudGltZUlkID0gY2hpbGQuZ2V0U3RyaW5nKCJydW50aW1lLWlkIik7Ci0JCQkJCVN0cmluZyB0ZW1wID0gY2hpbGQuZ2V0U3RyaW5nKCJlbnRyeSIpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKQotCQkJCQkJc2F1LmVudHJ5ID0gbmV3IFBhdGgodGVtcCk7Ci0JCQkJCXRlbXAgPSBjaGlsZC5nZXRTdHJpbmcoInNvdXJjZS1hdHRhY2htZW50LXBhdGgiKTsKLQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkKLQkJCQkJCXNhdS5zb3VyY2VBdHRhY2htZW50UGF0aCA9IG5ldyBQYXRoKHRlbXApOwotCQkJCQl0ZW1wID0gY2hpbGQuZ2V0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiKTsKLQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkKLQkJCQkJCXNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBuZXcgUGF0aCh0ZW1wKTsKLQkJCQkJSU1lbWVudG9bXSBhdHRyQ2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZHJlbigiYXR0cmlidXRlIik7Ci0JCQkJCWlmIChhdHRyQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUyID0gYXR0ckNoaWxkcmVuLmxlbmd0aDsKLQkJCQkJCXNhdS5hdHRyaWJ1dGVzID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbc2l6ZTJdOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBhdHRyQ2hpbGRyZW5bal0uZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCQkJCQkJU3RyaW5nIHZhbHVlID0gYXR0ckNoaWxkcmVuW2pdLmdldFN0cmluZygidmFsdWUiKTsKLQkJCQkJCQlzYXUuYXR0cmlidXRlc1tqXSA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlQXR0YWNobWVudHMuYWRkKHNhdSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNvdXJjZSBhdHRhY2htZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNvdXJjZSBwYXRoIGluZm8iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgc291cmNlIGF0dGFjaG1lbnQgaW5mby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJaWYgKHNvdXJjZUF0dGFjaG1lbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpZCA9IGV4dGVuc2lvbklkOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChpZCArICIueG1sIikudG9PU1N0cmluZygpOwotCQl0cnkgewotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoImNsYXNzcGF0aCIpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNvdXJjZUF0dGFjaG1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU291cmNlQXR0YWNobWVudFVwZGF0ZSBzYXUgPSAoU291cmNlQXR0YWNobWVudFVwZGF0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgic291cmNlLWF0dGFjaG1lbnQiKTsKLQkJCQljaGlsZC5wdXRTdHJpbmcoInJ1bnRpbWUtaWQiLCBzYXUucnVudGltZUlkKTsKLQkJCQlpZiAoc2F1LmVudHJ5ICE9IG51bGwpCi0JCQkJCWNoaWxkLnB1dFN0cmluZygiZW50cnkiLCBzYXUuZW50cnkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQlpZiAoc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoICE9IG51bGwpCi0JCQkJCWNoaWxkLnB1dFN0cmluZygic291cmNlLWF0dGFjaG1lbnQtcGF0aCIsIHNhdS5zb3VyY2VBdHRhY2htZW50UGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCWlmIChzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoICE9IG51bGwpCi0JCQkJCWNoaWxkLnB1dFN0cmluZygic291cmNlLWF0dGFjaG1lbnQtcm9vdC1wYXRoIiwgc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCWlmIChzYXUuYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyIDogc2F1LmF0dHJpYnV0ZXMpIHsKLQkJCQkJCUlNZW1lbnRvIGF0dHJDaGlsZCA9IGNoaWxkLmNyZWF0ZUNoaWxkKCJhdHRyaWJ1dGUiKTsKLQkJCQkJCWF0dHJDaGlsZC5wdXRTdHJpbmcoIm5hbWUiLCBhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCQlhdHRyQ2hpbGQucHV0U3RyaW5nKCJ2YWx1ZSIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW1lbWVudG8uc2F2ZVRvRmlsZShmaWxlbmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzYXZpbmcgc291cmNlIHBhdGggaW5mbyIsIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjBkYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTVJ1bm5lckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47Ci0vKioKLSAqIEEgc2VydmVyIHByb2ZpbGVyIGRlbGVnYXRlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBwcm9maWxlciBkZWxlZ2F0ZS4gVGhpcyBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBKYXZhIGxhdW5jaCBjb25maWd1cmF0aW9uIGFib3V0IHRvIGJlIHJ1biB0byBzdXBwb3J0IHByb2ZpbGluZy4KLQkgKiBWTSBhcmdzIG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgc2V0IHRvIGFsbG93IHByb2ZpbGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIHRoZSBsYXVuY2gKLQkgKiBAcGFyYW0gdm1JbnN0YWxsIHRoZSB2bSBpbnN0YWxsIGJlaW5nIHJ1biBhZ2FpbnN0Ci0JICogQHBhcmFtIHZtQ29uZmlnIHRoZSBjb25maWd1cmF0aW9uIHRvIHByb2Nlc3MKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGR1cmluZyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgSVZNSW5zdGFsbCB2bUluc3RhbGwsIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgSmF2YSBsYXVuY2ggY29uZmlndXJhdGlvbiBhYm91dCB0byBiZSBydW4gdG8gc3VwcG9ydCBwcm9maWxpbmcuCi0JICogVk0gYXJncyBvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHNldCB0byBhbGxvdyBwcm9maWxpbmcuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaCB0aGUgbGF1bmNoCi0JICogQHBhcmFtIHZtSW5zdGFsbCB0aGUgdm0gaW5zdGFsbCBiZWluZyBydW4gYWdhaW5zdAotCSAqIEBwYXJhbSB2bUNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiB0byBwcm9jZXNzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBwcm9maWxlcnMgY29uZmlndXJlZCBvciB0aGVyZSBpcyBhIHByb2JsZW0KLQkgKiAgIGNvbmZpZ3VyaW5nIHRoZSBsYXVuY2gKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlUHJvZmlsaW5nKElMYXVuY2ggbGF1bmNoLCBJVk1JbnN0YWxsIHZtSW5zdGFsbCwgVk1SdW5uZXJDb25maWd1cmF0aW9uIHZtQ29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSmF2YVNlcnZlclBsdWdpbi5jb25maWd1cmVQcm9maWxpbmcobGF1bmNoLCB2bUluc3RhbGwsIHZtQ29uZmlnLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2bGV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjYzRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotLyoqCi0gKiBBIEoyRUUgU2VydmxldC4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldCBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBhbGlhczsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYSBzZXJ2bGV0LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBzZXJ2bGV0IGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQKLQkgKiBAcGFyYW0gYWxpYXMgdGhlIHNlcnZsZXQncyBhbGlhcwotCSAqLwotCXB1YmxpYyBTZXJ2bGV0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgYWxpYXMpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMuYWxpYXMgPSBhbGlhczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgc2VydmxldC4KLQkgKi8KLQlwdWJsaWMgU2VydmxldCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2bGV0J3MgYWxpYXMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmxldCdzIGFsaWFzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0U2VydmxldCwgY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKLQkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7Ci0JCXMgPSBzLnN1YnN0cmluZyhpbmQrMik7Ci0JCWluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJY2xhc3NOYW1lID0gcy5zdWJzdHJpbmcoMCwgaW5kKTsKLQkJYWxpYXMgPSBzLnN1YnN0cmluZyhpbmQrMik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7Ci0JCXNiLmFwcGVuZCgiLy8iKTsKLQkJc2IuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCXNiLmFwcGVuZCgiLy8iKTsKLQkJc2IuYXBwZW5kKGFsaWFzKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmxldCBbbW9kdWxlPSIgKyBnZXRNb2R1bGUoKSArICIsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAiLCBhbGlhcz0iICsgYWxpYXMgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0ZmNhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZSBleHRlbmRzIFJ1bnRpbWVEZWxlZ2F0ZSBpbXBsZW1lbnRzIElHZW5lcmljUnVudGltZSwgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGdlbmVyaWMgcnVudGltZS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1J1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElHZW5lcmljUnVudGltZSNnZXRWTUluc3RhbGwoKQotCSAqLwotCXB1YmxpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbCgpIHsKLQkJaWYgKGdldFZNSW5zdGFsbFR5cGVJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQl0cnkgewotCQkJSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkpOwotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKTsKLQkJCVN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7Ci0JCQlmb3IgKElWTUluc3RhbGwgdm1JbnN0IDogdm1JbnN0YWxscykgewotCQkJCWlmIChpZC5lcXVhbHModm1JbnN0LmdldElkKCkpKQotCQkJCQlyZXR1cm4gdm1JbnN0OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkKLQkJSVJ1bnRpbWUgcnVudGltZSA9IGdldFJ1bnRpbWUoKTsKLQotCQlJUGF0aCBwYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JMb2NhdGlvbiwgbnVsbCk7Ci0JCWVsc2UgaWYgKGdldFZNSW5zdGFsbCgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCQllbHNlCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5I3NldFZNSW5zdGFsbChJVk1JbnN0YWxsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotCQlpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLQkJCXNldFZNSW5zdGFsbChudWxsLCBudWxsKTsKLQkJfSBlbHNlCi0JCQlzZXRWTUluc3RhbGwodm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpLCB2bUluc3RhbGwuZ2V0SWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Vk1JbnN0YWxsKFN0cmluZyB0eXBlSWQsIFN0cmluZyBpZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgdHlwZUlkKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmJiNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIGV4dGVuZHMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgewotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0LCBJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCUlQYXRoIGluc3RhbGxQYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQkKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJCi0JCUxpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIGluc3RhbGxQYXRoLnRvRmlsZSgpLCBmYWxzZSk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtsaXN0LnNpemUoKV0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmYmIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciB0aGUgZ2VuZXJpYyBKMkVFIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZVV0aWwgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiOwotCi0JLyoqCi0JICogQ2Fubm90IGNyZWF0ZSBHZW5lcmljUnVudGltZVV0aWwgLSB1c2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljUnVudGltZVV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHJ1bnRpbWUgaXMgYSBnZW5lcmljIEoyRUUgcnVudGltZSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gVGhlIHJ1bnRpbWUgbWF5IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJpY0oyRUVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmCi0JCQlydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5zdGFydHNXaXRoKFJVTlRJTUVfVFlQRV9JRCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRiZDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNSdW50aW1lIGV4dGVuZHMgSUphdmFSdW50aW1lIHsKLQkvLyBubyBhZGRpdGlvbmFsIG1ldGhvZHMKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjMTk2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSmF2YVJ1bnRpbWVXb3JraW5nQ29weTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJR2VuZXJpY1J1bnRpbWUsIElKYXZhUnVudGltZVdvcmtpbmdDb3B5IHsKLQkvLyBubyBuZXcgbWV0aG9kcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwZDFmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBtZW1lbnRvIHVzZWQgZm9yIHNhdmluZyB0aGUgaW1wb3J0YW50IHN0YXRlIG9mIGFuIG9iamVjdAotICogaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIE1lbWVudG9zIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBpbiBtaW5kOgotICogPG9sPgotICogIDxsaT5DZXJ0YWluIG9iamVjdHMgbmVlZCB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHBsYXRmb3JtIHNlc3Npb25zLgotICogICAgPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIGFuIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBhbiBvYmplY3QgbWlnaHQgbm90Ci0gKiAgICBiZSBhdmFpbGFibGUuIEl0IG11c3QgYmUgcG9zc2libGUgdG8gc2tpcCBhbiBvYmplY3QgaW4gdGhpcyBjYXNlLjwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIHRoZSBvYmplY3QgbWF5IGJlCi0gKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHdoZW4gdGhlIG9iamVjdCB3YXMgb3JpZ2luYWxseSBzYXZlZC4gSWYgc28sIHRoZQotICogICAgbmV3IGNsYXNzIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBmb3JtIG9mIHRoZSBkYXRhLjwvbGk+Ci0gKiA8L29sPgotICogPC9wPgotICogPHA+Ci0gKiBNZW1lbnRvcyBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cyBieSBwcm92aWRpbmcgc3VwcG9ydCBmb3Igc3RvcmluZyBhCi0gKiBtYXBwaW5nIG9mIGFyYml0cmFyeSBzdHJpbmcga2V5cyB0byBwcmltaXRpdmUgdmFsdWVzLCBhbmQgYnkgYWxsb3dpbmcKLSAqIG1lbWVudG9zIHRvIGhhdmUgb3RoZXIgbWVtZW50b3MgYXMgY2hpbGRyZW4gKGFycmFuZ2VkIGludG8gYSB0cmVlKS4KLSAqIEEgcm9idXN0IGV4dGVybmFsIHN0b3JhZ2UgZm9ybWF0IGJhc2VkIG9uIFhNTCBpcyB1c2VkLgotICogPC9wPjxwPgotICogVGhlIGtleSBmb3IgYW4gYXR0cmlidXRlIG1heSBiZSBhbnkgYWxwaGEgbnVtZXJpYyB2YWx1ZS4gIEhvd2V2ZXIsIHRoZQotICogdmFsdWUgb2YgPGNvZGU+VEFHX0lEPC9jb2RlPiBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgotICogPC9wPjxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbWVudG8gewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPmdldENoaWxkPC9jb2RlPiBhbmQgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG1ldGhvZHMKLQkgKiBhcmUgdXNlZCB0byByZXRyaWV2ZSBjaGlsZHJlbiBvZiBhIGdpdmVuIHR5cGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcmV0dXJuIGEgbmV3IGNoaWxkIG1lbWVudG8KLQkgKiBAc2VlICNnZXRDaGlsZAotCSAqIEBzZWUgI2dldENoaWxkcmVuCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmYTUwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVMYXVuY2hhYmxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5KbmRpTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGU7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTGF1bmNoYWJsZUNsaWVudCBleHRlbmRzIENsaWVudERlbGVnYXRlIHsKLQkvKgotCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjc3VwcG9ydHMoSUxhdW5jaGFibGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gKGxhdW5jaGFibGUgaW5zdGFuY2VvZiBKbmRpTGF1bmNoYWJsZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENsaWVudERlbGVnYXRlI2xhdW5jaChJTGF1bmNoYWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSUxhdW5jaCBsYXVuY2gpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiSk5ESSBjbGllbnQgbGF1bmNoZWQiKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmJmOGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSjJFRU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZGVhbGluZyB3aXRoIEoyRUUgbW9kdWxlcy4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX01PRFVMRSA9ICJqc3QuZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRSA9ICJqc3Qud2ViIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNb2R1bGVbXSBFTVBUWV9MSVNUID0gbmV3IElNb2R1bGVbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPElNb2R1bGUsIExpc3Q8SU1vZHVsZT4+IGVhckNhY2hlOwotCXByaXZhdGUgc3RhdGljIE1hcDxJSjJFRU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4gZWFyQ2FjaGUyOwotCXByaXZhdGUgc3RhdGljIE1hcDxJTW9kdWxlLCBMaXN0PElNb2R1bGU+PiB3ZWJDYWNoZTsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjYWNoZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb25zIHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgd2l0aGluLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBKMkVFIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRFbnRlcnByaXNlQXBwbGljYXRpb25zKElKMkVFTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzaG91bGRVc2VDYWNoZSgpKSB7Ci0JCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBlYXJDYWNoZTIuZ2V0KG1vZHVsZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOyAKLQkJfQotCQkKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhFQVJfTU9EVUxFKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZTIgOiBtb2R1bGVzKSB7Ci0JCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlMi5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAoZWFyICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtIDogbW9kdWxlczIpIHsKLQkJCQkJCQlpZiAobW9kdWxlLmVxdWFscyhtLmxvYWRBZGFwdGVyKElKMkVFTW9kdWxlLmNsYXNzLCBtb25pdG9yKSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIEoyRUUgbW9kdWxlIG9yIHV0aWxpdHkgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldEVudGVycHJpc2VBcHBsaWNhdGlvbnMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoc2hvdWxkVXNlQ2FjaGUoKSkgewotCQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gZWFyQ2FjaGUuZ2V0KG1vZHVsZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOyAKLQkJfQotCQkKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhFQVJfTU9EVUxFKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZTIgOiBtb2R1bGVzKSB7Ci0JCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlMi5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAoZWFyICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtIDogbW9kdWxlczIpIHsKLQkJCQkJCQlpZiAobW9kdWxlLmVxdWFscyhtKSkKLQkJCQkJCQkJbGlzdC5hZGQobW9kdWxlMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgbW9kdWxlcyB0aGF0IHRoZSB1dGlsaXR5IG1vZHVsZSBpcyBjb250YWluZWQgd2l0aGluLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSB1dGlsaXR5IG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2Ygd2ViIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRXZWJNb2R1bGVzKElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNob3VsZFVzZUNhY2hlKCkpIHsKLQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IHdlYkNhY2hlLmdldChtb2R1bGUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQkJfQotCQkKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhXRUJfTU9EVUxFKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZTIgOiBtb2R1bGVzKSB7Ci0JCQkJSVdlYk1vZHVsZSB3ZWIgPSAoSVdlYk1vZHVsZSkgbW9kdWxlMi5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAod2ViICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gd2ViLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtIDogbW9kdWxlczIpIHsKLQkJCQkJCQlpZiAobW9kdWxlLmVxdWFscyhtKSkKLQkJCQkJCQkJbGlzdC5hZGQobW9kdWxlMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxDYWNoZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZWFyQ2FjaGUgPSBuZXcgSGFzaE1hcDxJTW9kdWxlLCBMaXN0PElNb2R1bGU+PigpOwotCQllYXJDYWNoZTIgPSBuZXcgSGFzaE1hcDxJSjJFRU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4oKTsKLQkJd2ViQ2FjaGUgPSBuZXcgSGFzaE1hcDxJTW9kdWxlLCBMaXN0PElNb2R1bGU+PigpOwotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRUFSX01PRFVMRSk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWZvciAoSU1vZHVsZSBtb2R1bGUyIDogbW9kdWxlcykgewotCQkJCUlFbnRlcnByaXNlQXBwbGljYXRpb24gZWFyID0gKElFbnRlcnByaXNlQXBwbGljYXRpb24pIG1vZHVsZTIubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7Ci0JCQkJaWYgKGVhciAhPSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGVhci5nZXRNb2R1bGVzKCk7Ci0JCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKElNb2R1bGUgbW0gOiBtb2R1bGVzMikgewotCQkJCQkJCUxpc3Q8SU1vZHVsZT4gbSA9IGVhckNhY2hlLmdldChtbSk7Ci0JCQkJCQkJaWYgKG0gPT0gbnVsbCkgewotCQkJCQkJCQltID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigyKTsKLQkJCQkJCQkJZWFyQ2FjaGUucHV0KG1tLCBtKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbS5hZGQobW9kdWxlMik7Ci0JCQkJCQkJCi0JCQkJCQkJSUoyRUVNb2R1bGUgbW9kID0gKElKMkVFTW9kdWxlKSBtbS5sb2FkQWRhcHRlcihJSjJFRU1vZHVsZS5jbGFzcywgbW9uaXRvcik7Ci0JCQkJCQkJaWYgKG1vZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW0gPSBlYXJDYWNoZTIuZ2V0KG1vZCk7Ci0JCQkJCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCQkJCW0gPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KDIpOwotCQkJCQkJCQkJZWFyQ2FjaGUyLnB1dChtb2QsIG0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW0uYWRkKG1vZHVsZTIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhXRUJfTU9EVUxFKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZTIgOiBtb2R1bGVzKSB7Ci0JCQkJSVdlYk1vZHVsZSB3ZWIgPSAoSVdlYk1vZHVsZSkgbW9kdWxlMi5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAod2ViICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gd2ViLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtbSA6IG1vZHVsZXMyKSB7Ci0JCQkJCQkJTGlzdDxJTW9kdWxlPiBtID0gd2ViQ2FjaGUuZ2V0KG1tKTsKLQkJCQkJCQlpZiAobSA9PSBudWxsKSB7Ci0JCQkJCQkJCW0gPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KDIpOwotCQkJCQkJCQl3ZWJDYWNoZS5wdXQobW0sIG0pOwotCQkJCQkJCX0KLQkJCQkJCQltLmFkZChtb2R1bGUyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlQ2FjaGUoKSB7Ci0JCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJKMkVFY2FjaGUiKTsKLQkJaWYgKHMgPT0gbnVsbCB8fCAiIi5lcXVhbHMocykgfHwgImZhbHNlIi5lcXVhbHMocykpIHsKLQkJCXdlYkNhY2hlID0gbnVsbDsKLQkJCWVhckNhY2hlID0gbnVsbDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2FjaGUgPT0gbnVsbCB8fCAhY2FjaGUuZXF1YWxzKHMpKSB7Ci0JCQljYWNoZSA9IHM7Ci0JCQlmaWxsQ2FjaGUobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSlJFUnVudGltZUNvbXBvbmVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0pSRVJ1bnRpbWVDb21wb25lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFmYWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSlJFUnVudGltZUNvbXBvbmVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgSlJFUnVudGltZUNvbXBvbmVudFByb3ZpZGVyIGV4dGVuZHMgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUgewotCi0JcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJLy8gZGVmaW5lIEpSRSBjb21wb25lbnQKLQkJSUphdmFSdW50aW1lIGphdmFSdW50aW1lID0gKElKYXZhUnVudGltZSkgcnVudGltZS5sb2FkQWRhcHRlcihJSmF2YVJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCQlpZiAoamF2YVJ1bnRpbWUgIT0gbnVsbCkgewotCQkgICAgZmluYWwgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBqYXZhUnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LmNyZWF0ZSggdm1JbnN0YWxsICk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcmMgKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KYXZhU2VydmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlMDVjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciB0b29saW5nIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEphdmFTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIEphdmEgc2VydmVyIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiOwotCi0JLy8gc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQlwcml2YXRlIHN0YXRpYyBKYXZhU2VydmVyUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXI+IHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIHByb2ZpbGVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8U2VydmVyUHJvZmlsZXI+IHNlcnZlclByb2ZpbGVyczsKLQkKLQkvLyBydW50aW1lIGxpc3RlbmVyCi0JcHJpdmF0ZSBzdGF0aWMgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBydW50aW1lTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIEphdmFTZXJ2ZXJQbHVnaW4uCi0JICovCi0JcHVibGljIEphdmFTZXJ2ZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVNlcnZlclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCXJ1bnRpbWVMaXN0ZW5lciA9IG5ldyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcnVudGltZUFkZGVkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQloYW5kbGVSdW50aW1lQ2hhbmdlKHJ1bnRpbWUsIDApOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW50aW1lQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJaGFuZGxlUnVudGltZUNoYW5nZShydW50aW1lLCAxKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCWhhbmRsZVJ1bnRpbWVDaGFuZ2UocnVudGltZSwgMik7Ci0JCQl9Ci0JCX07Ci0JCQotCQlTZXJ2ZXJDb3JlLmFkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihydW50aW1lTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VydmVyQ29yZS5yZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIocnVudGltZUxpc3RlbmVyKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0Mik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgcnVudGltZSBjaGFuZ2UgYnkgcG90ZW50aWFsbHkgdXBkYXRpbmcgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUnVudGltZUNoYW5nZShmaW5hbCBJUnVudGltZSBydW50aW1lLCBmaW5hbCBpbnQgYWN0KSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQb3NzaWJsZSBydW50aW1lIGNoYW5nZTogIiArIHJ1bnRpbWUpOwotCQkKLQkJaWYgKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJZmluYWwgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciByY3B3ID0gZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkpOwotCQlpZiAocmNwdyAhPSBudWxsICYmIChyY3B3Lmhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKHJ1bnRpbWUpIHx8IGFjdCAhPSAxKSkgewotCQkJZmluYWwgSVBhdGggc2VydmVyQ29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUikKLQkJCQkuYXBwZW5kKHJjcHcuZ2V0SWQoKSkuYXBwZW5kKHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkKLQkJCWNsYXNzIFJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCQkJcHVibGljIFJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYigpIHsKLQkJCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMudXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVycywgcnVudGltZS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJCQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoIXByb2plY3QuaXNOYXR1cmVFbmFibGVkKEphdmFDb3JlLk5BVFVSRV9JRCkpCi0JCQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2UgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGNwIDogY2UpIHsKLQkJCQkJCQkJCQlpZiAoY3AuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkJCQkJCQkJaWYgKHNlcnZlckNvbnRhaW5lclBhdGguaXNQcmVmaXhPZihjcC5nZXRQYXRoKCkpKQotCQkJCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xhc3NwYXRoIGNoYW5nZSBvbjogIiArIHByb2plY3QgKyAiICIgKyBmb3VuZCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmIChmb3VuZCkgewotCQkJCQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gcnVudGltZTsKLQkJCQkJCQkJCQlpZiAoYWN0ID09IDIpCi0JCQkJCQkJCQkJCXJ1bnRpbWUyID0gbnVsbDsKLQkJCQkJCQkJCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKHByb2plY3QsCi0JCQkJCQkJCQkJCQlzZXJ2ZXJDb250YWluZXJQYXRoLCByY3B3LCBydW50aW1lMiwgcnVudGltZS5nZXRJZCgpKTsKLQkJCQkJCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoc2VydmVyQ29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgamF2YVByb2plY3QgfSwKLQkJCQkJCQkJCQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10ge2NvbnRhaW5lcn0sIG51bGwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHVwZGF0ZSBjbGFzc3BhdGggY29udGFpbmVyIiwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX0KLQkJCVJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYiBqb2IgPSBuZXcgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iKCk7Ci0JCQlqb2Iuc2NoZWR1bGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUKLQkgKiByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMKLQkgKiAgICAgICAgIHtAbGluayBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcltdIGdldFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKSB7Ci0JCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOwotCQkKLQkJUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcltdIHJ0aCA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuc2l6ZSgpXTsKLQkJcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy50b0FycmF5KHJ0aCk7Ci0JCXJldHVybiBydGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duIHJ1bnRpbWUKLQkgKiBjbGFzc3BhdGggcHJvdmlkZXJzICh7QGxpbmsgI2dldFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKX0pIGZvciB0aGUgb25lIHdpdGgKLQkgKiBhIG1hdGNoaW5nIHJ1bnRpbWUgdHlwZS4KLQkgKiBUaGUgcnVudGltZVR5cGUgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlpZiAocnVudGltZVR5cGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciA9IChSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLnN1cHBvcnRzUnVudGltZVR5cGUocnVudGltZVR5cGUpKQotCQkJCXJldHVybiBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlIGlkLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXJzICh7QGxpbmsgI2dldFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKX0pIGZvciB0aGUgb25lCi0JICogd2l0aCBhIG1hdGNoaW5nIHJ1bnRpbWUgdHlwZSBpZC4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCBhIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgdGhlcmUgaXMgbm8gcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckJ5U3VwcG9ydChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciA9IChSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLnN1cHBvcnRzUnVudGltZVR5cGUoaWQpKQotCQkJCXJldHVybiBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24gcnVudGltZQotCSAqIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aAotCSAqIGEgbWF0Y2hpbmcgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaWQgKHtAbGluayBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyI2dldElkKCl9KS4KLQkgKiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpZAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgdGhlcmUgaXMgbm8gcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciA9IChSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpIHsKLQkJaWYgKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiKTsKLQkJCi0JCUxpc3Q8UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcj4oY2YubGVuZ3RoKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcihjZSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnM6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnM6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCXJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgPSBsaXN0OwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gc2VydmVyIHByb2ZpbGVyIGluc3RhbmNlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2Ygc2VydmVyIHByb2ZpbGVyIGluc3RhbmNlcwotCSAqICAgIHtAbGluayBTZXJ2ZXJQcm9maWxlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclByb2ZpbGVyW10gZ2V0U2VydmVyUHJvZmlsZXJzKCkgewotCQlpZiAoc2VydmVyUHJvZmlsZXJzID09IG51bGwpCi0JCQlsb2FkU2VydmVyUHJvZmlsZXJzKCk7Ci0JCQotCQlTZXJ2ZXJQcm9maWxlcltdIHNwID0gbmV3IFNlcnZlclByb2ZpbGVyW3NlcnZlclByb2ZpbGVycy5zaXplKCldOwotCQlzZXJ2ZXJQcm9maWxlcnMudG9BcnJheShzcCk7Ci0JCXJldHVybiBzcDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgcHJvZmlsZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRTZXJ2ZXJQcm9maWxlcnMoKSB7Ci0JCWlmIChzZXJ2ZXJQcm9maWxlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLnNlcnZlclByb2ZpbGVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAic2VydmVyUHJvZmlsZXJzIik7Ci0JCQotCQlMaXN0PFNlcnZlclByb2ZpbGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJQcm9maWxlcj4oY2YubGVuZ3RoKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgU2VydmVyUHJvZmlsZXIoY2UpKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBzZXJ2ZXJQcm9maWxlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVyUHJvZmlsZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCXNlcnZlclByb2ZpbGVycyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5zZXJ2ZXJQcm9maWxlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVQcm9maWxpbmcoSUxhdW5jaCBsYXVuY2gsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1Db25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXJ2ZXJQcm9maWxlcltdIHNwID0gSmF2YVNlcnZlclBsdWdpbi5nZXRTZXJ2ZXJQcm9maWxlcnMoKTsKLQkJaWYgKHNwID09IG51bGwgfHwgc3AubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUHJvZmlsZXIsIG51bGwpKTsKLQkJCi0JCXNwWzBdLnByb2Nlc3MobGF1bmNoLCB2bUluc3RhbGwsIHZtQ29uZmlnLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hDb25maWd1cmF0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hDb25maWd1cmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZlMTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoQ29uZmlndXJhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoQ29uZmlndXJhdGlvblV0aWwgewotCS8qKgotCSAqIEdldHMgdGhlIGNsYXNzcGF0aCBmcm9tIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIElmIGNyZWF0ZSBpcyBmYWxzZSwgaXQgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIChpLmUuIHRoZSBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHJ1biBiZWZvcmUpIElmIGNyZWF0ZSBpcyB0cnVlLCBpdCB3aWxsIGNyZWF0ZQotCSAqIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaWYgb25lIGRvZXMgbm90IGV4aXN0LgotCSAqCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgcnVudGltZSBjbGFzc3BhdGggZW50cmllcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCS8qcHVibGljIHN0YXRpYyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoKElTZXJ2ZXIgc2VydmVyLCBib29sZWFuIGNyZWF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlcnZlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uKGNyZWF0ZSwgbW9uaXRvcik7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aChjb25maWcpOwotCX0qLwotCi0JLyoqCi0JICogU2V0cyB0aGUgY2xhc3NwYXRoIG9uIHRoZSBnaXZlbiBzZXJ2ZXIncyBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gY2xhc3NwYXRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JLypwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoKElTZXJ2ZXIgc2VydmVyLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VydmVyLmdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbW9uaXRvcik7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILCBmYWxzZSk7Ci0JCi0JCUxpc3QgbWVtZW50b3MgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCW1lbWVudG9zLmFkZChlbnRyeS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEgsIG1lbWVudG9zKTsKLQkJd2MuZG9TYXZlKCk7Ci0JfSovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZmVlZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJVbmJvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDcmVhdGluZ1ppcEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm90QURpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RTZXJ2bGV0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0RUpCOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0Sk5ESTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdENhY3R1c1Rlc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Nb2RpZnlNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Qcm9maWxlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM2Y2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb249U2VydmVyIExpYnJhcnkKLWNsYXNzcGF0aENvbnRhaW5lcj17MH0gW3sxfV0KLWNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQ9ezB9IFt7MX1dICh1bmJvdW5kKQotCi1lcnJvckxvY2F0aW9uPUludmFsaWQgbG9jYXRpb24uCi1lcnJvckpSRT1JbnZhbGlkIEpSRS4KLQotY29weWluZ1Rhc2s9Q29weWluZyBmcm9tIHswfSB0byB7MX0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLWVycm9yQ29weWluZ0ZpbGU9RXJyb3IgY29weWluZyBmaWxlIHswfTogezF9Ci1lcnJvckNyZWF0aW5nWmlwRmlsZT1FcnJvciBjcmVhdGluZyB6aXAgZmlsZSB7MH06IHsxfQotZXJyb3JEZWxldGU9Q291bGQgbm90IGRlbGV0ZSBwcmV2aW91cyBjb3B5LCB3aGljaCBtYXkgYmUgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy4KLWVycm9yUmVuYW1lPUNvdWxkIG5vdCByZXBsYWNlIHdpdGggdGVtcCBmaWxlIHswfS4KLWVycm9yUmVhZGluZz1FcnJvciByZWFkaW5nIGZpbGUgezB9Ci1lcnJvck5vUnVudGltZT1DYW5ub3QgdmVyaWZ5IGZhY2V0cyBiZWNhdXNlIHRoZXJlIGlzIG5vIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi1lcnJvckZhY2V0PVByb2plY3QgZmFjZXQgezB9IHZlcnNpb24gezF9IGlzIG5vdCBzdXBwb3J0ZWQuCi1lcnJvckRlbGV0aW5nPUNvdWxkIG5vdCBkZWxldGUgezB9LiBNYXkgYmUgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy4KLWVycm9yTm90QURpcmVjdG9yeT1Db3VsZCBub3QgZGVsZXRlIHswfSBzaW5jZSBpdCBpcyBub3QgYSBkaXJlY3RvcnkuCi1lcnJvck1rZGlyPUNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLQotdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVycz1VcGRhdGluZyBjbGFzc3BhdGggY29udGFpbmVyIGZvciB7MH0KLQotYXJ0aWZhY3RTZXJ2bGV0PVNlcnZsZXQgezB9Ci1hcnRpZmFjdEVKQj1FSkIgezB9Ci1hcnRpZmFjdEpOREk9Sk5ESSB7MH0KLWFydGlmYWN0Q2FjdHVzVGVzdD1DYWN0dXMgdGVzdCB7MH0KLQotY2FuTW9kaWZ5TW9kdWxlcz1XZWIgbW9kdWxlIGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmVyLgotZXJyb3JOb1Byb2ZpbGVyPUNvdWxkIG5vdCBsYXVuY2ggaW4gcHJvZmlsaW5nIG1vZGUgYmVjYXVzZSBubyBwcm9maWxlcnMgYXJlIGNvbmZpZ3VyZWQuCi1lcnJvclB1Ymxpc2g9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgcHVibGlzaGluZy4KLWh0dHBQb3J0PUhUVFAgUG9ydAotZXJyb3JQb3J0SW5Vc2U9UG9ydCB7MH0gcmVxdWlyZWQgYnkgezF9IGlzIGFscmVhZHkgaW4gdXNlLiBUaGUgc2VydmVyIG1heSBhbHJlYWR5IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLCBvciBhIHN5c3RlbSBwcm9jZXNzIG1heSBiZSB1c2luZyB0aGUgcG9ydC4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHN0b3AgdGhlIG90aGVyIHByb2Nlc3Mgb3IgY2hhbmdlIHRoZSBwb3J0IG51bWJlcihzKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkOTlkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NGIwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7Ci0JLyoqCi0JICogVGhlIHNlcnZlciBjb250YWluZXIgaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NPTlRBSU5FUiA9IEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5jb250YWluZXIiOwotCi0JcHJpdmF0ZSBJUGF0aCBwYXRoOwotCXByaXZhdGUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBkZWxlZ2F0ZTsKLQlwcml2YXRlIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgcnVudGltZUlkOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyBhIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBwYXRoLCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlLCBJUnVudGltZSBydW50aW1lKSB7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSBjbGFzc3BhdGggY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEBwYXJhbSBydW50aW1lSWQKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRoLCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlLCBJUnVudGltZSBydW50aW1lLCBTdHJpbmcgcnVudGltZUlkKSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJdGhpcy5ydW50aW1lSWQgPSBydW50aW1lSWQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0Q2xhc3NwYXRoRW50cmllcygpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBydW50aW1lICE9IG51bGwpCi0JCQllbnRyaWVzID0gZGVsZWdhdGUucmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwocHJvamVjdCwgcnVudGltZSk7Ci0JCQotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQotCQlyZXR1cm4gZW50cmllczsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lciwgcnVudGltZVR5cGUuZ2V0TmFtZSgpLCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQsIE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uLCBydW50aW1lSWQpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIElDbGFzc3BhdGhDb250YWluZXIuS19BUFBMSUNBVElPTjsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIHJjYyA9IChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKSBvYmo7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmICFkZWxlZ2F0ZS5lcXVhbHMocmNjLmRlbGVnYXRlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChydW50aW1lID09IG51bGwgJiYgcmNjLnJ1bnRpbWUgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChydW50aW1lICE9IG51bGwgJiYgIXJ1bnRpbWUuZXF1YWxzKHJjYy5ydW50aW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChydW50aW1lSWQgIT0gbnVsbCAmJiAhcnVudGltZUlkLmVxdWFscyhyY2MucnVudGltZUlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChwcm9qZWN0ID09IG51bGwgJiYgcmNjLnByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXF1YWxzKHJjYy5wcm9qZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChwYXRoICE9IG51bGwgJiYgIXBhdGguZXF1YWxzKHJjYy5wYXRoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE3Y2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZXh0ZW5kcyBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciB7Ci0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI2luaXRpYWxpemUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUikpIHsKLQkJCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlID0gbnVsbDsKLQkJCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJCQlTdHJpbmcgcnVudGltZUlkID0gbnVsbDsKLQkJCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKLQkJCQkJZGVsZWdhdGUgPSBKYXZhU2VydmVyUGx1Z2luLmZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoY29udGFpbmVyUGF0aC5zZWdtZW50KDEpKTsKLQkJCQkJCi0JCQkJCXJ1bnRpbWVJZCA9IGNvbnRhaW5lclBhdGguc2VnbWVudCgyKTsKLQkJCQkJaWYgKHJ1bnRpbWVJZCAhPSBudWxsKQotCQkJCQkJcnVudGltZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWUocnVudGltZUlkKTsKLQkJCQl9Ci0JCQkJUnVudGltZUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcihwcm9qZWN0LmdldFByb2plY3QoKSwgY29udGFpbmVyUGF0aCwgZGVsZWdhdGUsIHJ1bnRpbWUsIHJ1bnRpbWVJZCk7Ci0JCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIG5ldyBJSmF2YVByb2plY3RbXSB7cHJvamVjdH0sIG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10ge2NvbnRhaW5lcn0sIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUikpIHsKLQkJCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlID0gbnVsbDsKLQkJCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKLQkJCQkJZGVsZWdhdGUgPSBKYXZhU2VydmVyUGx1Z2luLmZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoY29udGFpbmVyUGF0aC5zZWdtZW50KDEpKTsKLQkJCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IGNvbnRhaW5lclBhdGguc2VnbWVudCgyKTsKLQkJCQkJaWYgKHJ1bnRpbWVJZCAhPSBudWxsKQotCQkJCQkJcnVudGltZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWUocnVudGltZUlkKTsKLQkJCQkJZGVsZWdhdGUucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShydW50aW1lLCBjb250YWluZXJTdWdnZXN0aW9uLmdldENsYXNzcGF0aEVudHJpZXMoKSk7Ci0JCQkJCS8vSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIG5ldyBJSmF2YVByb2plY3RbXSB7IHByb2plY3QgfSwKLQkJCQkJLy8JCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBjb250YWluZXJTdWdnZXN0aW9uIH0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl1cGRhdGVDbGFzc3BhdGgocnVudGltZSwgY29udGFpbmVyUGF0aCwgY29udGFpbmVyU3VnZ2VzdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUNsYXNzcGF0aChmaW5hbCBJUnVudGltZSBydW50aW1lLCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lclN1Z2dlc3Rpb24pIHsKLQkJY2xhc3MgVXBkYXRlQ2xhc3NwYXRoSm9iIGV4dGVuZHMgSm9iIHsKLQkJCXB1YmxpYyBVcGRhdGVDbGFzc3BhdGhKb2IoKSB7Ci0JCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMudXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVycywgcnVudGltZS5nZXROYW1lKCkpKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJCX0KLQotCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJTGlzdDxJSmF2YVByb2plY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4oKTsKLQkJCQlpZiAocHJvamVjdHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoIXByb2plY3QuaXNOYXR1cmVFbmFibGVkKEphdmFDb3JlLk5BVFVSRV9JRCkpCi0JCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJCi0JCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCQkJCi0JCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2UgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY3AgOiBjZSkgewotCQkJCQkJCQkJaWYgKGNwLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKSB7Ci0JCQkJCQkJCQkJaWYgKGNvbnRhaW5lclBhdGguaXNQcmVmaXhPZihjcC5nZXRQYXRoKCkpKQotCQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNsYXNzcGF0aCBjaGFuZ2Ugb246ICIgKyBwcm9qZWN0ICsgIiAiICsgZm91bmQpOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYgKGZvdW5kKQotCQkJCQkJCQkJbGlzdC5hZGQoamF2YVByb2plY3QpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCB1cGRhdGUgY2xhc3NwYXRoIGNvbnRhaW5lciIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJCWlmIChzaXplID4gMCkgewotCQkJCQlJSmF2YVByb2plY3RbXSBqYXZhUHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W3NpemVdOwotCQkJCQlsaXN0LnRvQXJyYXkoamF2YVByb2plY3RzKTsKLQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltzaXplXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQljb250YWluZXJzW2ldID0gY29udGFpbmVyU3VnZ2VzdGlvbjsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3RzLCBjb250YWluZXJzLCBtb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCQkJcmV0dXJuIGptZS5nZXRTdGF0dXMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfQotCQlVcGRhdGVDbGFzc3BhdGhKb2Igam9iID0gbmV3IFVwZGF0ZUNsYXNzcGF0aEpvYigpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0Q29tcGFyaXNvbklEKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyaXNvbklEKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChjb250YWluZXJQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBjb250YWluZXJQYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWFmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gU3VwcG9ydCBmb3IgYWxsIHNlcnZlciB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIGltcGxlbWVudHMgSUNsYXNzcGF0aFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFdFQl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LndlYiIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgRUpCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuZWpiIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFQVJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5lYXIiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFVUSUxJVFlfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC51dGlsaXR5Iik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBDT05ORUNUT1JfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5jb25uZWN0b3IiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEFQUF9DTElFTlRfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5hcHBjbGllbnQiKTsKLQotCXByaXZhdGUgSVJ1bnRpbWVDb21wb25lbnQgcmM7Ci0KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCXRoaXMucmMgPSByYzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDbGFzc3BhdGhFbnRyaWVzKElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2KSB7Ci0JCUlQcm9qZWN0RmFjZXQgcGYgPSBmdi5nZXRQcm9qZWN0RmFjZXQoKTsKLQkJaWYgKHBmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChwZi5lcXVhbHMoV0VCX0ZBQ0VUKSB8fCBwZi5lcXVhbHMoRUpCX0ZBQ0VUKSB8fCBwZi5lcXVhbHMoRUFSX0ZBQ0VUKSB8fAotCQkJCXBmLmVxdWFscyhVVElMSVRZX0ZBQ0VUKSB8fCBwZi5lcXVhbHMoQ09OTkVDVE9SX0ZBQ0VUKSB8fCBwZi5lcXVhbHMoQVBQX0NMSUVOVF9GQUNFVCkpIHsKLQkJCVN0cmluZyBydW50aW1lVHlwZUlkID0gcmMuZ2V0UHJvcGVydHkoInR5cGUtaWQiKTsKLQkJCVN0cmluZyBydW50aW1lSWQgPSByYy5nZXRQcm9wZXJ0eSgiaWQiKTsKLQkJCWlmIChydW50aW1lVHlwZUlkID09IG51bGwgfHwgcnVudGltZUlkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBKYXZhU2VydmVyUGx1Z2luLmZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJCeVN1cHBvcnQocnVudGltZVR5cGVJZCk7Ci0JCQlpZiAocmNwdyAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUik7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKHJjcHcuZ2V0SWQoKSkuYXBwZW5kKHJ1bnRpbWVJZCk7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGNwZW50cnkgPSBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShwYXRoKTsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjcGVudHJ5KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJQ2xhc3NwYXRoUHJvdmlkZXIuY2xhc3MgfTsKLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJCUlSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBhZGFwdGFibGU7Ci0JCQlyZXR1cm4gbmV3IFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihyYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZmNkNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSB0YXJnZXQgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBvcmRlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZHMiKSwgIiwiKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcGFyc2UgcnVudGltZSB0eXBlIGlkczogIiArIGVsZW1lbnQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldFNlcnZlclJlc291cmNlcygpIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lVHlwZSBhIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwcG9ydHNSdW50aW1lVHlwZShydW50aW1lVHlwZS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldFNlcnZlclJlc291cmNlcygpIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBhIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlTdHJpbmdbXSBzID0gZ2V0UnVudGltZVR5cGVJZHMoKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWZvciAoU3RyaW5nIHNzIDogcykgewotCQkJaWYgKHNzLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc3MubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChzcy5zdWJzdHJpbmcoMCwgc3MubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc3MpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSBkZWxlZ2F0ZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZShnZXRJZCgpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUHJvamVjdCwgSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkucmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwocHJvamVjdCwgcnVudGltZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUjcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUnVudGltZSwgSUNsYXNzcGF0aEVudHJ5W10pCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUnVudGltZSBydW50aW1lLCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlnZXREZWxlZ2F0ZSgpLnJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUocnVudGltZSwgZW50cmllcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNoYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5oYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChydW50aW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhlNGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5SdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlOwotLyoqCi0gKiBBIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVyIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgcnVudGltZSBjb21wb25lbnRzIGZvciBhIGZhY2V0IHJ1bnRpbWUuCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHNjb3BlZCBieSBydW50aW1lIHR5cGUgYW5kIG1heSBwcm92aWRlIGNvbXBvbmVudHMgZm9yIG11bHRpcGxlCi0gKiBydW50aW1lIGluc3RhbmNlcy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+aW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUgZXh0ZW5kcyBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIHsKLQkvLyBub3RoaW5nIGFkZGVkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0MjRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNvbXBvbmVudCBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZHMiKSwgIiwiKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcGFyc2UgcnVudGltZSB0eXBlIGlkczogIiArIGVsZW1lbnQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldFNlcnZlclJlc291cmNlcygpIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lVHlwZSBhIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBydW50aW1lVHlwZS5nZXRJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRSdW50aW1lVHlwZUlkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJZm9yIChTdHJpbmcgc3MgOiBzKSB7Ci0JCQlpZiAoc3MuZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzcy5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNzLnN1YnN0cmluZygwLCBzcy5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzcykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGRlbGVnYXRlIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlI2dldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0UnVudGltZUNvbXBvbmVudHMocnVudGltZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lRmFjZXRNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZDA0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVGYWNldE1hcHBpbmcgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSBmYWNldCBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFJ1bnRpbWVGYWNldE1hcHBpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVR5cGVJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ29tcG9uZW50KCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUtY29tcG9uZW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSdW50aW1lRmFjZXRNYXBwaW5nWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJvZmlsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJvZmlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiNjM5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByb2ZpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNUnVubmVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQcm9maWxlciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIHByb2ZpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFNlcnZlclByb2ZpbGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JLyoKLQkgKiBMb2FkcyB0aGUgZGVsZWdhdGUgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgU3dpdGNoIHRvIG5ldyBBUEkgdmlhIFRPRE8KLQkgKiBAcmV0dXJuIHRoZSBWTSBhcmdzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWTUFyZ3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1Db25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSBkZWwgPSBnZXREZWxlZ2F0ZSgpOwotCQkJaWYgKGRlbCAhPSBudWxsKQotCQkJCWRlbC5wcm9jZXNzKGxhdW5jaCwgdm1JbnN0YWxsLCB2bUNvbmZpZywgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyUHJvZmlsZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5ZjBmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCS8qKgotCSAqIFdhcm5pbmcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQkvKioKLQkgKiBTZXZlcmUgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCS8qKgotCSAqIEZpbmVzdCB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUFVCTElTSElORyA9IDQ7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKiBAcGFyYW0gdCBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCi0JCWlmICghSmF2YVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWYxNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0vKioKLSAqIEEgTWVtZW50byBpcyBhIGNsYXNzIGluZGVwZW5kZW50IGNvbnRhaW5lciBmb3IgcGVyc2lzdGVuY2UKLSAqIGluZm8uICBJdCBpcyBhIHJlZmxlY3Rpb24gb2YgMyBzdG9yYWdlIHJlcXVpcmVtZW50cy4KLSAqCi0gKiAxKSAgIFdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gcGVyc2lzdCBhbiBvYmplY3QgYW5kIHJlc3RvcmUgaXQuICAKLSAqIDIpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGJlIGFic2VudC4gIElmIHNvIHdlIHdvdWxkIAotICogICAgICBsaWtlIHRvIHNraXAgdGhlIG9iamVjdCBhbmQga2VlcCByZWFkaW5nLiAKLSAqIDMpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGNoYW5nZS4gIElmIHNvIHRoZSBuZXcgY2xhc3MgCi0gKiAgICAgIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBwZXJzaXN0ZW5jZSBpbmZvLgotICoKLSAqIFdlIGNvdWxkIGFzayB0aGUgb2JqZWN0cyB0byBzZXJpYWxpemUgdGhlbXNlbHZlcyBpbnRvIGFuIAotICogT2JqZWN0T3V0cHV0U3RyZWFtLCBEYXRhT3V0cHV0U3RyZWFtLCBvciBIYXNodGFibGUuICBIb3dldmVyIAotICogYWxsIG9mIHRoZXNlIGFwcHJvYWNoZXMgZmFpbCB0byBtZWV0IHRoZSBzZWNvbmQgcmVxdWlyZW1lbnQuCi0gKgotICogTWVtZW50byBzdXBwb3J0cyBiaW5hcnkgcGVyc2lzdGFuY2Ugd2l0aCBhIHZlcnNpb24gSUQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCXByaXZhdGUgRG9jdW1lbnQgZmFjdG9yeTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEFuc3dlciBhIG1lbWVudG8gZm9yIHRoZSBkb2N1bWVudCBhbmQgZWxlbWVudC4gIEZvciBzaW1wbGljaXR5Ci0JICogeW91IHNob3VsZCB1c2UgY3JlYXRlUmVhZFJvb3QgYW5kIGNyZWF0ZVdyaXRlUm9vdCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLQkgKiBtZW1lbnRvcyBvbiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgWE1MTWVtZW50byhEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWwpIHsKLQkJZmFjdG9yeSA9IGRvYzsKLQkJZWxlbWVudCA9IGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jY3JlYXRlQ2hpbGQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSkgewotCQlFbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCi0JICogYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUxpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oc2l6ZSk7Ci0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCWxpc3QuYWRkKGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBDcmVhdGUgYSBtZW1lbnRvIGZvciBlYWNoIG5vZGUuCi0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJSU1lbWVudG8gW10gcmVzdWx0cyA9IG5ldyBJTWVtZW50b1tzaXplXTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzaXplOyB4ICsrKSB7Ci0JCQlyZXN1bHRzW3hdID0gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgbGlzdC5nZXQoeCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKLQkJCXJldHVybiBYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KGluKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvcyBhbiBvdXRwdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWVtZW50byB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJc2F2ZSh3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyZjQ0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2FjdHVzTGF1bmNoYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByb2plY3RuYW1lOwotCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRlc3ROYW1lOwotCXByaXZhdGUgVVJMIGZDYWN0dXNVUkw7Ci0KLQlwdWJsaWMgQ2FjdHVzTGF1bmNoYWJsZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB0ZXN0TmFtZSwgVVJMIGNhY3R1c1VSTCkgewotCQlmUHJvamVjdG5hbWUgPSBwcm9qZWN0TmFtZTsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJZlRlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCWZDYWN0dXNVUkwgPSBjYWN0dXNVUkw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXN0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgewotCQlyZXR1cm4gZlRlc3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBmUHJvamVjdG5hbWU7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRDYWN0dXNVUkwoKSB7Ci0JCXJldHVybiBmQ2FjdHVzVVJMOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOGY2ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kdWxlQXJ0aWZhY3QgaW5zdGFuY2VvZiBXZWJUZXN0YWJsZVJlc291cmNlKSB7Ci0JCQlXZWJUZXN0YWJsZVJlc291cmNlIHJlc291cmNlID0gKFdlYlRlc3RhYmxlUmVzb3VyY2UpIG1vZHVsZUFydGlmYWN0OwotCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXIuZ2V0QWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MpKQotCQkJCQkuZ2V0TW9kdWxlUm9vdFVSTChyZXNvdXJjZS5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCVN0cmluZyB1cmxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi8iKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nLnN1YnN0cmluZygwLCB1cmxTdHJpbmcubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBsYXVuY2hhYmxlIiwgZSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgQ2FjdHVzTGF1bmNoYWJsZShyZXNvdXJjZS5nZXRQcm9qZWN0TmFtZSgpLAotCQkJCQlyZXNvdXJjZS5nZXRDbGFzc05hbWUoKSwgcmVzb3VyY2UuZ2V0VGVzdE5hbWUoKSwgdXJsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTI4MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY3R1c01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX1RFU1RfQ0FTRV9UWVBFID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfTUVUSE9EID0gInN1aXRlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTX05BTUUgPSAianVuaXQuZnJhbWV3b3JrLlRlc3QiOwotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gIiI7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBvYmo7Ci0JCQltZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlvYmogPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlTdHJpbmcgdGVzdENsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZvclR5cGUocmVzb3VyY2UpOwotCQkJaWYgKHRlc3RDbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHJlc291cmNlLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIG5ldyBXZWJUZXN0YWJsZVJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBmYWxzZSwKLQkJCQkJCXByb2plY3ROYW1lLCB0ZXN0Q2xhc3NOYW1lLCBtZXRob2ROYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmICghImphdmEiLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmICEiY2xhc3MiLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKHBhdGggPT0gbnVsbCB8fCAhcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCWlmICghamF2YVByb2plY3QuaXNPcGVuKCkpCi0JCQkJamF2YVByb2plY3Qub3BlbihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQotCQkJLy8gb3V0cHV0IGxvY2F0aW9uIG1heSBub3QgYmUgb24gY2xhc3NwYXRoCi0JCQlJUGF0aCBvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCWlmIChvdXRwdXRQYXRoICE9IG51bGwKLQkJCQkJJiYgImNsYXNzIi5lcXVhbHMocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIG91dHB1dFBhdGguaXNQcmVmaXhPZihwYXRoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGNvdW50ID0gb3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvdW50KTsKLQkJCX0KLQkJCQotCQkJLy8gcmVtb3ZlIGluaXRpYWwgcGFydCBvZiBjbGFzc3BhdGgKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzUGF0aEVudHJ5ID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQlpZiAoY2xhc3NQYXRoRW50cnkgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2xhc3NQYXRoRW50cnkubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlQYXRoIGNsYXNzUGF0aCA9IGNsYXNzUGF0aEVudHJ5W2ldLmdldFBhdGgoKTsKLQkJCQkJaWYgKGNsYXNzUGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCQlpbnQgY291bnQgPSBjbGFzc1BhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvdW50KTsKLQkJCQkJCWkgKz0gc2l6ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ2V0IGphdmEgZWxlbWVudAotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gamF2YVByb2plY3QuZmluZEVsZW1lbnQocGF0aCk7Ci0JCQlJVHlwZVtdIHR5cGVzID0gZ2V0VHlwZXMoamF2YUVsZW1lbnQpOwotCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZTIgPSB0eXBlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChoYXNTdXBlcmNsYXNzKHR5cGVzW2ldKSB8fCBoYXNTdWl0ZU1ldGhvZCh0eXBlc1tpXSkpCi0JCQkJCQlyZXR1cm4gdHlwZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNTdWl0ZU1ldGhvZChJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQkJaW50IHNpemUgPSBtZXRob2RzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGggPT0gMCAmJiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoU1VJVEVfTUVUSE9EKSkgewotCQkJCVN0cmluZyByZXR1cm5UeXBlID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yTWFuZ2xlZFR5cGUobWV0aG9kLmdldFJldHVyblR5cGUoKSwgdHlwZSk7Ci0JCQkJaWYgKFRFU1RfQ0xBU1NfTkFNRS5lcXVhbHMocmV0dXJuVHlwZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZVtdIGdldFR5cGVzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCkuZ2V0QWxsVHlwZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlcmNsYXNzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCQkJaW50IHNpemUgPSBzdXBlckNsYXNzZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoU0VSVkxFVF9URVNUX0NBU0VfVFlQRS5lcXVhbHMoc3VwZXJDbGFzc2VzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRNb2R1bGVzKCJqc3Qud2ViIikpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGVGb3JNYW5nbGVkVHlwZShTdHJpbmcgdHlwZSwKLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0eXBlID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGUpOwotCQlyZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yVHlwZSh0eXBlLCBkZWNsYXJpbmdUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yVHlwZShTdHJpbmcgdHlwZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSkKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdbXVtdIHJlc29sdmVkVHlwZXMgPSBkZWNsYXJpbmdUeXBlLnJlc29sdmVUeXBlKHR5cGUpOwotCQkvLyBBcmUgdGhlcmUgbGVnaXQgY2FzZXMgd2hlcmUgdGhpcyB3b3VsZCBub3QgYmUgdGhlIGNhc2U/IFdlIG1pZ2h0IG5lZWQgdG8gY2hlY2sKLQkJLy8gZm9yIHRoaXMgYW5kIGJvbWIgb3V0IGlmIHRoZSB0eXBlIGNhbm5vdCBiZSB1bmFtYmlnaW91c2x5IHJlc29sdmVkCi0JCWlmIChyZXNvbHZlZFR5cGVzLmxlbmd0aCAhPSAxKQotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlRoZSB0eXBlIGNhbm5vdCBiZSB1bmFtYmlnaW91c2x5IHJlc29sdmVkLiBOZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2UiKTsKLQkJU3RyaW5nW10gcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZWRUeXBlc1swXTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHZlZFR5cGUubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHJlc29sdmVkVHlwZVtpXSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKHJlc29sdmVkVHlwZVtyZXNvbHZlZFR5cGUubGVuZ3RoIC0gMV0pOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1NlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzcwNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRSA9ICJpc1NlcnZsZXRUZXN0Q2FzZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1VQRVJDTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSAoKElBZGFwdGFibGUpIHJlY2VpdmVyKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ci0JCQkJfHwgamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdAotCQkJCXx8IGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRS5lcXVhbHMobWV0aG9kKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGlzU2VydmxldFRlc3RDYXNlKGphdmFFbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VydmxldFRlc3RDYXNlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlUeXBlIHRlc3RUeXBlID0gbnVsbDsKLQotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotCQkJCXRlc3RUeXBlID0gY3UuZ2V0VHlwZShTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGN1LmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJdGVzdFR5cGUgPSAoKElDbGFzc0ZpbGUpIGVsZW1lbnQpLmdldFR5cGUoKTsKLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkKLQkJCQl0ZXN0VHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKQotCQkJCXRlc3RUeXBlID0gKChJTWVtYmVyKSBlbGVtZW50KS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQkKLQkJCWlmICh0ZXN0VHlwZSAhPSBudWxsICYmIHRlc3RUeXBlLmV4aXN0cygpICYmIGlzVGVzdE9yU3VpdGUodGVzdFR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2hlY2tpbmcgaXNTZXJ2bGV0IiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0VHlwZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHRlc3QsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Rlc3RPclN1aXRlKElUeXBlIHRlc3RUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVR5cGVbXSB0eXBlcyA9IHRlc3RUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKS5nZXRBbGxTdXBlcmNsYXNzZXModGVzdFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodHlwZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFRFU1RfU1VQRVJDTEFTU19OQU1FKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY4NzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1dlYlRlc3RhYmxlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFdlYlRlc3RhYmxlUmVzb3VyY2UgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlIHsKLQlwcml2YXRlIGJvb2xlYW4gZlNlcnZsZXRJc0NvbmZpZ3VyZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmVGVzdE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByb2plY3ROYW1lOwotCi0JcHVibGljIFdlYlRlc3RhYmxlUmVzb3VyY2UoSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gc2VydmxldElzQ29uZmlndXJlZCwKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JCWZTZXJ2bGV0SXNDb25maWd1cmVkID0gc2VydmxldElzQ29uZmlndXJlZDsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJZlRlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCWZQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLQotCXB1YmxpYyBXZWJUZXN0YWJsZVJlc291cmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBmUHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0Q29uZmlndXJlZCgpIHsKLQkJcmV0dXJuIGZTZXJ2bGV0SXNDb25maWd1cmVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgewotCQlyZXR1cm4gZlRlc3ROYW1lOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0Q2FjdHVzVGVzdCwgZlRlc3ROYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKLQkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7Ci0JCXMgPSBzLnN1YnN0cmluZyhpbmQrMik7Ci0JCWluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJZlByb2plY3ROYW1lID0gcy5zdWJzdHJpbmcoMCwgaW5kKTsKLQkJCi0JCXMgPSBzLnN1YnN0cmluZyhpbmQrMik7Ci0JCWluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJZkNsYXNzTmFtZSA9IHMuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQotCQlpZiAoJ1QnID09IHMuY2hhckF0KGluZCsyKSkKLQkJCWZTZXJ2bGV0SXNDb25maWd1cmVkID0gdHJ1ZTsKLQkJZWxzZQotCQkJZlNlcnZsZXRJc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLQkJZlRlc3ROYW1lID0gcy5zdWJzdHJpbmcoaW5kKzMpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI3NlcmlhbGl6ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuc2VyaWFsaXplKCkpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCXNiLmFwcGVuZChmUHJvamVjdE5hbWUpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCXNiLmFwcGVuZChmQ2xhc3NOYW1lKTsKLQkJc2IuYXBwZW5kKCIvLyIpOwotCQlpZiAoZlNlcnZsZXRJc0NvbmZpZ3VyZWQpCi0JCQlzYi5hcHBlbmQoIlQiKTsKLQkJZWxzZQotCQkJc2IuYXBwZW5kKCJGIik7Ci0JCXNiLmFwcGVuZChmVGVzdE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYTNjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U3VwcG9ydCBmb3IgSmF2YSBhbmQgSjJFRSBzZXJ2ZXIgdHlwZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyIGNsYXNzIHByb3ZpZGVzIGEgY29tbW9uIHN1YmNsYXNzCi1mb3IgcnVudGltZSB0YXJnZXQgaGFuZGxlcnMgdGhhdCBuZWVkIHRvIG1vZGlmeSBhIHByb2plY3QncyBjbGFzc3BhdGgKLXdoZW4gYSBwcm9qZWN0IGlzIHRhcmdldHRlZCB0byBhIHBhcnRpY3VsYXIgcnVudGltZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5JR2VuZXJpY1J1bnRpbWUgYW5kIGl0cyB3b3JraW5nIGNvcHkgcHJvdmlkZSB0eXBlLXNwZWNpZmljIGFjY2VzcwotdG8gdGhlIGdlbmVyaWMgcnVudGltZSB0eXBlLiBXaGVuIHVzaW5nIGEgZ2VuZXJpYyBydW50aW1lLCBjbGllbnRzIGNhbgotYWNjZXNzIHRoZSB0eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uIGJ5IGFkYXB0aW5nIHRvIHRoZXNlIHR5cGVzIHVzaW5nCi08cHJlPklHZW5lcmljUnVudGltZSBnciA9IChJR2VuZXJpY1J1bnRpbWUpIHJ1bnRpbWUuZ2V0QWRhcHRlcihJR2VuZXJpY1J1bnRpbWUuY2xhc3MpPC9wcmU+LgotR2VuZXJpY1J1bnRpbWVVdGlsIGNvbnRhaW5zIHNvbWUgdXRpbGl0eSBtZXRob2RzIGZvciBoYW5kbGluZyB0aGUKLWdlbmVyaWMgcnVudGltZSB0eXBlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklFbnRlcnByaXNlQXBwbGljYXRpb24sIElFSkJNb2R1bGUsIElXZWJNb2R1bGUsIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSwKLWFuZCBJQ29ubmVjdG9yTW9kdWxlIGFyZSBKMkVFIG1vZHVsZSBpbnRlcmZhY2VzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkCi1ieSBtb2R1bGUgZGVsZWdhdGVzIHRoYXQgcHJvdmlkZSBKMkVFIG1vZHVsZSBzdXBwb3J0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklMb29zZUFyY2hpdmUgYW5kIElMb29zZUFyY2hpdmVTdXBwb3J0IGFyZSBtb2R1bGUgaW50ZXJmYWNlcyBmb3IgbW9kdWxlcwotdGhhdCB0YWtlIGFkdmFudGFnZSBvZiBsb29zZSBhcmNoaXZlIHN1cHBvcnQgLSBhbGxvd2luZyBKQVJzIGNvbnRhaW5lZCB3aXRoaW4KLXRoZSBtb2R1bGUgdG8gYmUgYXZhaWxhYmxlIGluIGEgc2VwYXJhdGUgSmF2YSBwcm9qZWN0IGluc3RlYWQgb2YgZGlyZWN0bHkKLXdpdGhpbiB0aGUgbW9kdWxlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlRoZSByZW1haW5kZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBtb2R1bGUgYXJ0aWZhY3QgYW5kCi1sYXVuY2hhYmxlIHR5cGVzIHRvIHByb3ZpZGUgYWNjZXNzIHRvIEoyRUUgcmVzb3VyY2UgdHlwZXMgZm9yIHRoZSBzZXJ2ZXIgdG9vbAotZnJhbWV3b3JrLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGMwNTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPHA+U3VwcG9ydCBmb3IgSmF2YSBhbmQgSjJFRSBzZXJ2ZXIgdHlwZXMuPC9wPgotCi08cD5UaGUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIgY2xhc3MgcHJvdmlkZXMgYSBjb21tb24gc3ViY2xhc3MKLWZvciBydW50aW1lIHRhcmdldCBoYW5kbGVycyB0aGF0IG5lZWQgdG8gbW9kaWZ5IGEgcHJvamVjdCdzIGNsYXNzcGF0aAotd2hlbiBhIHByb2plY3QgaXMgdGFyZ2V0dGVkIHRvIGEgcGFydGljdWxhciBydW50aW1lLjwvcD4KLQotPHA+SUdlbmVyaWNSdW50aW1lIGFuZCBpdHMgd29ya2luZyBjb3B5IHByb3ZpZGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3MKLXRvIHRoZSBnZW5lcmljIHJ1bnRpbWUgdHlwZS4gV2hlbiB1c2luZyBhIGdlbmVyaWMgcnVudGltZSwgY2xpZW50cyBjYW4KLWFjY2VzcyB0aGUgdHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBieSBhZGFwdGluZyB0byB0aGVzZSB0eXBlcyB1c2luZwotPHByZT5JR2VuZXJpY1J1bnRpbWUgZ3IgPSAoSUdlbmVyaWNSdW50aW1lKSBydW50aW1lLmdldEFkYXB0ZXIoSUdlbmVyaWNSdW50aW1lLmNsYXNzKTwvcHJlPi4KLUdlbmVyaWNSdW50aW1lVXRpbCBjb250YWlucyBzb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgdGhlCi1nZW5lcmljIHJ1bnRpbWUgdHlwZS48L3A+Ci0KLTxwPklFbnRlcnByaXNlQXBwbGljYXRpb24sIElFSkJNb2R1bGUsIElXZWJNb2R1bGUsIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSwKLWFuZCBJQ29ubmVjdG9yTW9kdWxlIGFyZSBKMkVFIG1vZHVsZSBpbnRlcmZhY2VzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkCi1ieSBtb2R1bGUgZGVsZWdhdGVzIHRoYXQgcHJvdmlkZSBKMkVFIG1vZHVsZSBzdXBwb3J0LjwvcD4KLQotPHA+SUxvb3NlQXJjaGl2ZSBhbmQgSUxvb3NlQXJjaGl2ZVN1cHBvcnQgYXJlIG1vZHVsZSBpbnRlcmZhY2VzIGZvciBtb2R1bGVzCi10aGF0IHRha2UgYWR2YW50YWdlIG9mIGxvb3NlIGFyY2hpdmUgc3VwcG9ydCAtIGFsbG93aW5nIEpBUnMgY29udGFpbmVkIHdpdGhpbgotdGhlIG1vZHVsZSB0byBiZSBhdmFpbGFibGUgaW4gYSBzZXBhcmF0ZSBKYXZhIHByb2plY3QgaW5zdGVhZCBvZiBkaXJlY3RseQotd2l0aGluIHRoZSBtb2R1bGUuPC9wPgotCi08cD5UaGUgcmVtYWluZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgbW9kdWxlIGFydGlmYWN0IGFuZAotbGF1bmNoYWJsZSB0eXBlcyB0byBwcm92aWRlIGFjY2VzcyB0byBKMkVFIHJlc291cmNlIHR5cGVzIGZvciB0aGUgc2VydmVyIHRvb2wKLWZyYW1ld29yay48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3YjM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1nZW5lcmljc2VydmVyLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmVfMS4wLjAuamFyCi10ZW1wLmZvbGRlcgotZ2VuZXJpY3NlcnZlcnNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU3N2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdlZTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJhMGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEp1biAxMSAyMzowNTo0OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDIzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwNS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5hbnQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scztidW5kbGUtdmVyc2lvbj0iWzMuMS4xMDAsMy4zLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuYXBhY2hlLmFudDtidW5kbGUtdmVyc2lvbj0iWzEuNi41LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjNkZTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgeHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSB4c2QvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDdlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT0gR2VuZXJpYyBTZXJ2ZXIgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIGdlbmVyaWMgc2VydmVyIHRvb2xzIHdpdGggZWFzeSB0byBkZXZlbG9wIG1ldGEgZGF0YSBjb25maWd1cmF0aW9uIGZpbGVzCi0KLWV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGVOYW1lPUdlbmVyaWMgU2VydmVyKEV4dGVybmFsIExhdW5jaCkKLWxhdW5jaENvbmZpZ3VyYXRpb25UeXBlTmFtZT1HZW5lcmljIFNlcnZlcgotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJkZWZpbml0aW9uPVNlcnZlciBkZWZpbml0aW9uCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVkZWZpbml0aW9uPVJ1bnRpbWUgZGVmaW5pdGlvbgotZXh0ZW5zaW9uUG9pbnRHZW5lcmljcHVibGlzaGVyPUdlbmVyaWMgUHVibGlzaGVyCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5OWU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZlcmRlZmluaXRpb24iIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlcmRlZmluaXRpb24iIHNjaGVtYT0ic2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZCIvPgotIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVkZWZpbml0aW9uIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lZGVmaW5pdGlvbiIgc2NoZW1hPSJzY2hlbWEvcnVudGltZWRlZmluaXRpb24uZXhzZCIvPgotIDxleHRlbnNpb24tcG9pbnQgaWQ9ImdlbmVyaWNwdWJsaXNoZXIiIG5hbWU9IiVleHRlbnNpb25Qb2ludEdlbmVyaWNwdWJsaXNoZXIiIHNjaGVtYT0ic2NoZW1hL2dlbmVyaWNwdWJsaXNoZXIuZXhzZCIvPgotCQotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgbmFtZT0iJWxhdW5jaENvbmZpZ3VyYXRpb25UeXBlTmFtZSIKLSAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sIGRlYnVnLCBwcm9maWxlIgotICAgICAgICBzb3VyY2VMb2NhdG9ySWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlTG9jYXRvci5KYXZhU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiLz4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICBuYW1lPSIlZXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZU5hbWUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICAgICAgbW9kZXM9InJ1biwgZGVidWciCi0gICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIvPgotIDwvZXh0ZW5zaW9uPgotCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXJzIj4KLSAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc291cmNlUGF0aENvbXB1dGVyIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIi8+Ci0gPC9leHRlbnNpb24+Ci0gCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyI+Ci0gICAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2ViIi8+Ci0gPC9leHRlbnNpb24+Ci0gCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuZ2VuZXJpY3B1Ymxpc2hlciI+Ci0gICAgICA8Z2VuZXJpY3B1Ymxpc2hlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnMuQW50UHVibGlzaGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiLz4KLSA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9nZW5lcmljcHVibGlzaGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9nZW5lcmljcHVibGlzaGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGFjNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zY2hlbWEvZ2VuZXJpY3B1Ymxpc2hlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIgaWQ9ImdlbmVyaWNwdWJsaXNoZXIiIG5hbWU9IkdlbmVyaWMgUHVibGlzaGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIERlZmluZXMgYSBwdWJsaXNoZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgcHVibGlzaGluZyBtb2R1bGVzIHRvIHNlcnZlcnMgZm9yIGdlbmVyaWMgc2VydmVycy4gCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImdlbmVyaWNwdWJsaXNoZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImdlbmVyaWNwdWJsaXNoZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIHRoYXQgcmVmZXJzIHRvIHRoaXMgcHVibGlzaGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBleHRlbmRzIEdlbmVyaWNQdWJsaXNoZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5nZW5lcmljcHVibGlzaGVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2dlbmVyaWNwdWJsaXNoZXIKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnMuQW50UHVibGlzaGVyJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSAmbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjbGFzcyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljUHVibGlzaGVyIGFic3RyYWN0IGNsYXNzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9ydW50aW1lZGVmaW5pdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zY2hlbWEvcnVudGltZWRlZmluaXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlZDBlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9ydW50aW1lZGVmaW5pdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIgaWQ9InJ1bnRpbWVkZWZpbml0aW9uIiBuYW1lPSJSdW50aW1lIERlZmluaXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBhIG5ldyBnZW5lcmljIHNlcnZlciBydW50aW1lIGRlZmluaXRpb24gZmlsZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZWRlZmluaXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVkZWZpbml0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZpbml0aW9uZmlsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiB0aGUgZ2VuZXJpYyBzZXJ2ZXIgcnVudGltZSBkZWZpbml0aW9uIGZpbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5ydW50aW1lZGVmaW5pdGlvbiZxdW90OyZndDsKLSAgJmx0O3J1bnRpbWVkZWZpbml0aW9uIGlkPSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzNCZxdW90OyBkZWZpbml0aW9uZmlsZT0mcXVvdDsvcnVudGltZXMvam9uYXMucnVudGltZWRlZiZxdW90OyZndDsKLSAgJmx0Oy9ydW50aW1lZGVmaW5pdGlvbiZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IENhcGUgQ2xlYXIgU29mdHdhcmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzMzFmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9zZXJ2ZXJkZWZpbml0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiBpZD0ic2VydmVyZGVmaW5pdGlvbiIgbmFtZT0iU2VydmVyIERlZmluaXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBhIG5ldyBnZW5lcmljIHNlcnZlciBkZWZpbml0aW9uIGZpbGUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlcmRlZmluaXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlcmRlZmluaXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc2VydmVyIGlkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmaW5pdGlvbmZpbGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgbG9jYXRpb24gb2YgdGhlIGdlbmVyaWMgc2VydmVyIGRlZmluaXRpb24gZmlsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc2VydmVyZGVmaW5pdGlvbiZxdW90OyZndDsKLQkJJmx0O3NlcnZlcmRlZmluaXRpb24gaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXM0JnF1b3Q7IGRlZmluaXRpb25maWxlPSZxdW90Oy9zZXJ2ZXJzL2pvbmFzLnNlcnZlcmRlZiZxdW90OyZndDsKLQkJJmx0Oy9zZXJ2ZXJkZWZpbml0aW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9Db3JlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2IwZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0KLQkvKioKLQkgKiBQbHVnLWluIElECi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvcmVQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyIGZTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXI7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIGdlbmVyaWNTZXJ2ZXJDb3JlSW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0eXBlIGRlZmluaXRpb24gbWFuYWdlciBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyIGdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpCi0JewotCQlpZihmU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyPT1udWxsKQotCQkJZlNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlciA9IG5ldyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoZ2V0SW5zdGFsbFVybCgpKTsKLQkJcmV0dXJuIGZTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgVVJMIGdldEluc3RhbGxVcmwoKQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHRoaXMuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCi0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxEZWJ1Z0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxEZWJ1Z0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJhOTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsRGVidWdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogPHA+RXh0ZW5zaW9uIG9mIDxjb2RlPkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTwvY29kZT4gdGhhdCBzdXBwb3J0cyAKLSAqIHRoZSBjb25uZWN0aW9uIHRvIHJlbW90ZSBKVk1zIGZvciBleHRlcm5hbCBzZXJ2ZXJzLiBVc2VkIGZvciBkZWJ1Z2dpbmcuPC9wPgotICogCi0gKiA8cD5CYXNlZCBvbiBKYXZhUmVtb3RlQXBwbGljYXRpb25MYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbERlYnVnTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuYXR0YWNoaW5nVG9FeHRlcm5hbEdlbmVyaWNTZXJ2ZXIsbmV3IFN0cmluZ1tde2NvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpfSksIDMpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBtb25pdG9yLnN1YlRhc2soR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy52ZXJpZnlpbmdFeHRlcm5hbFNlcnZlckRlYnVnZ2luZ0xhdW5jaEF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb25uZWN0b3JJZCA9IGdldFZNQ29ubmVjdG9ySWQoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIElWTUNvbm5lY3RvciBjb25uZWN0b3IgPSBudWxsOwotICAgICAgICBpZiAoY29ubmVjdG9ySWQgPT0gbnVsbCkgewotICAgICAgICAgICAgY29ubmVjdG9yID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNQ29ubmVjdG9yKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25uZWN0b3IgPSBKYXZhUnVudGltZS5nZXRWTUNvbm5lY3Rvcihjb25uZWN0b3JJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmV4dGVybmFsU2VydmVyRGVidWdDb25uZWN0b3JOb3RTcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfQ09OTkVDVE9SX05PVF9BVkFJTEFCTEUpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWFwIGFyZ01hcCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NPTk5FQ1RfTUFQLCAoTWFwKW51bGwpOwotICAgICAgICAKLSAgICAgICAgaW50IGNvbm5lY3RUaW1lb3V0ID0gSmF2YVJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoSmF2YVJ1bnRpbWUuUFJFRl9DT05ORUNUX1RJTUVPVVQpOwotICAgICAgICBhcmdNYXAucHV0KCJ0aW1lb3V0IiwgIiIrY29ubmVjdFRpbWVvdXQpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgCi0gICAgICAgIG1vbml0b3Iuc3ViVGFzayhHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmNyZWF0aW5nRXh0ZXJuYWxTZXJ2ZXJEZWJ1Z2dpbmdTb3VyY2VMb2NhdG9yKTsKLSAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHNvdXJjZSBsb2NhdG9yIGlmIHJlcXVpcmVkCi0gICAgICAgIHNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOyAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gY29ubmVjdCB0byByZW1vdGUgVk0KLSAgICAgICAgY29ubmVjdG9yLmNvbm5lY3QoYXJnTWFwLCBtb25pdG9yLCBsYXVuY2gpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgIElEZWJ1Z1RhcmdldFtdIGRlYnVnVGFyZ2V0cyA9IGxhdW5jaC5nZXREZWJ1Z1RhcmdldHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVidWdUYXJnZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSURlYnVnVGFyZ2V0IHRhcmdldCA9IGRlYnVnVGFyZ2V0c1tpXTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNhbkRpc2Nvbm5lY3QoKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzIzNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICByZnJvc3RAYmVhLmNvbQotICogICAgdHlpcEBiZWEuY29tCi0gKiAgICAKLSAqICAgIEJhc2VkIG9uIEdlbmVyaWNTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgYnkgR29ya2VtIEVyY2FuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuUnVudGltZVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5BYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwotCi0vKioKLSAqIDxwPkV4dGVuc2lvbiBvZiA8Y29kZT5BYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU8L2NvZGU+IHRoYXQgc3VwcG9ydHMgCi0gKiBzZXJ2ZXJzIHdoaWNoIGFyZSBzdGFydGVkL3N0b3BwZWQgdmlhIGV4dGVybmFsIGV4ZWN1dGFibGVzIChlLmcuIHNjcmlwdHMpLjwvcD4KLSAqIAotICogPHA+Tm90ZTogPGNvZGU+QWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlPC9jb2RlPiBpcyBleHRlbmRlZCBzaW1wbHkgdG8gdGFrZSBhZHZhbnRhZ2UKLSAqIG9mIGEgc2V0IG9mIHVzZWZ1bCBjb2RlIHRoYXQgaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gbGF1bmNoaW5nIGEgSlZNLWJhc2VkIGFwcC48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVyIGZvciB0aGUgZXhlY3V0YWJsZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VYVEVSTkFMX0xBVU5DSF9UWVBFID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgZXhlY3V0YWJsZSBjb21tYW5kbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5ETElORSA9IENvcmVQbHVnaW4uUExVR0lOX0lEICArICIuQ09NTUFORExJTkUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgdGhhdCBob2xkcyBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBleHRlcm5hbCBleGVjdXRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVEFCTEVfTkFNRSA9IENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5FWEVDVVRBQkxFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgdGhhdCBob2xkcyB0aGUgZGVidWcgcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19QT1JUID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkRFQlVHX1BPUlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBleHRlcm5hbCBleGVjdXRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhFQ1VUQUJMRV9OQU1FID0gIkV4dGVybmFsIEdlbmVyaWMgU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIERlYnVnZ2luZyBsYXVuY2ggY29uZmlndXJhdGlvbiBkZWxlZ2F0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFeHRlcm5hbERlYnVnTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGRlYnVnZ2luZ0RlbGVnYXRlID0KLSAgICAgICAgbmV3IEV4dGVybmFsRGVidWdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUoKTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUjbGF1bmNoKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIAotCQkJICAgICAgIFN0cmluZyBtb2RlLAotCQkJICAgICAgIElMYXVuY2ggbGF1bmNoLCAKLQkJCSAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCSAgICBhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLm1pc3NpbmdTZXJ2ZXIsIG51bGwsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwotCQl9CQotCi0JCUV4dGVybmFsU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW9yID0gKEV4dGVybmFsU2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQkKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgc2VydmVyLCBjaGVjayB0aGUgcG9ydHMgYW5kIHN0YXJ0IHRoZSBQaW5nVGhyZWFkIHRoYXQgd2lsbCBjaGVjayAKLQkJLy8gc2VydmVyIHN0YXRlCi0JCXNlcnZlckJlaGF2aW9yLnNldHVwTGF1bmNoKGxhdW5jaCwgbW9kZSwgbW9uaXRvcik7Ci0JCQotCQkvLyBnZXQgdGhlICJleHRlcm5hbCIgY29tbWFuZAotCQlTdHJpbmcgY29tbWFuZGxpbmUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShDT01NQU5ETElORSwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChjb21tYW5kbGluZSA9PSBudWxsIHx8IGNvbW1hbmRsaW5lLmxlbmd0aCgpID09IDApIHsKLQkJCWFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuY29tbWFuZGxpbmVVbnNwZWNpZmllZCwgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7CQkJCi0JCX0KLQkJCi0JCS8vIHBhcnNlIHRoZSAiZXh0ZXJuYWwiIGNvbW1hbmQgaW50byBtdWx0aXBsZSBhcmdzCi0JCVN0cmluZ1tdIGNtZEFyZ3MgPSBEZWJ1Z1BsdWdpbi5wYXJzZUFyZ3VtZW50cyhjb21tYW5kbGluZSk7Ci0JCS8vIGdldCB0aGUgInByb2dyYW1Bcmd1bWVudHMiLCBwYXJzZWQgaW50byBtdWx0aXBsZSBhcmdzCi0JCVN0cmluZ1tdIHBnbUFyZ3MgPSBEZWJ1Z1BsdWdpbi5wYXJzZUFyZ3VtZW50cyhnZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pKTsKLQkJCi0JCS8vIENyZWF0ZSB0aGUgZnVsbCBhcnJheSBvZiBjbWRzCi0JCVN0cmluZ1tdIGNtZHMgPSBuZXcgU3RyaW5nW2NtZEFyZ3MubGVuZ3RoICsgcGdtQXJncy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNtZEFyZ3MsIDAsIGNtZHMsIDAsIGNtZEFyZ3MubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShwZ21BcmdzLCAwLCBjbWRzLCBjbWRBcmdzLmxlbmd0aCwgcGdtQXJncy5sZW5ndGgpOwotCQkKLQkJLy8gZ2V0IGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGV4ZWN1dGFibGUKLQkJU3RyaW5nIGV4ZWN1dGFibGVOYW1lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoRVhFQ1VUQUJMRV9OQU1FLCBERUZBVUxUX0VYRUNVVEFCTEVfTkFNRSk7Ci0JCQotCQkvLyBnZXQgdGhlIGV4ZWN1dGFibGUgZW52aXJvbm1lbnQKLQkJSUxhdW5jaE1hbmFnZXIgbWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCVN0cmluZ1tdIGVudiA9IG1hbmFnZXIuZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBnZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5Ci0JCUZpbGUgd29ya2luZ0RpciA9IHZlcmlmeVdvcmtpbmdEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7Ci0JCWlmICh3b3JraW5nRGlyID09IG51bGwpIHsKLQkJCWFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMud29ya2luZ2RpclVuc3BlY2lmaWVkLCBudWxsLCBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX0lOVEVSTkFMX0VSUk9SKTsJCQkKLQkJfQotCQkKLQkJLy8gTGF1bmNoIHRoZSBleGVjdXRhYmxlIGZvciB0aGUgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgQW50IEV4ZWN1dGUgY2xhc3MKLQkJdHJ5IHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IEV4ZWN1dGUubGF1bmNoKG51bGwsIGNtZHMsIGVudiwgd29ya2luZ0RpciwgdHJ1ZSk7Ci0JCQlzZXJ2ZXJCZWhhdmlvci5zdGFydFBpbmdUaHJlYWQoKTsKLQkJCUlQcm9jZXNzIHJ1bnRpbWVQcm9jZXNzID0gbmV3IFJ1bnRpbWVQcm9jZXNzKGxhdW5jaCwgcHJvY2VzcywgZXhlY3V0YWJsZU5hbWUsIG51bGwpOwotCQkJbGF1bmNoLmFkZFByb2Nlc3MocnVudGltZVByb2Nlc3MpOwotCQkJc2VydmVyQmVoYXZpb3Iuc2V0UHJvY2VzcyhydW50aW1lUHJvY2Vzcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvckxhdW5jaGluZ0V4ZWN1dGFibGUsIGlvZSwgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwotCQl9Ci0KLQkJaWYgKG1vZGUuZXF1YWxzKCJkZWJ1ZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBjcmVhdGVEZWJ1Z2dpbmdDb25maWcoY29uZmlndXJhdGlvbik7Ci0JCQkvLyBpZiB3ZSdyZSBsYXVuY2hpbmcgdGhlIGRlYnVnZ2luZyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb25maWcgdG8gc3RhcnQKLQkJCS8vIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGRlYnVnZ2luZyBzZXNzaW9uCi0JCQlzZXJ2ZXJCZWhhdmlvci5zZXREZWJ1Z2dpbmdDb25maWcod2MsIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY3JlYXRlRGVidWdnaW5nQ29uZmlnKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIAotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNvbmZpZ3VyYXRpb24uZ2V0V29ya2luZ0NvcHkoKTsKLSAgICAgICAgc2V0RGVidWdBcmd1bWVudCh3YywgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09OTkVDVF9NQVAsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0gICAgICAgIFN0cmluZyBwb3J0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoREVCVUdfUE9SVCwgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIGlmIChwb3J0PT1udWxsIHx8IHBvcnQubGVuZ3RoKCk9PTApIHsKLSAgICAgICAgCWFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZGVidWdQb3J0VW5zcGVjaWZpZWQsIG51bGwsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIHNldERlYnVnQXJndW1lbnQod2MsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NPTk5FQ1RfTUFQLCAicG9ydCIsIHBvcnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB3YzsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBkZWJ1Z2dpbmcgc2Vzc2lvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdGFydERlYnVnZ2luZyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjLAotCQkJICAgICAgIAkJCQkJCSBTdHJpbmcgbW9kZSwKLQkJCSAgICAgICAJCQkJCQkgSUxhdW5jaCBsYXVuY2gsIAotCQkJICAgICAgIAkJCQkJCSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RhcnRpbmcgZGVidWdnaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVidWdnaW5nRGVsZWdhdGUubGF1bmNoKHdjLCBtb2RlLCBsYXVuY2gsIG1vbml0b3IpOwotCX0KLQkgIAotICAgIHByaXZhdGUgdm9pZCBzZXREZWJ1Z0FyZ3VtZW50KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBTdHJpbmcgYXR0cmliS2V5LCBTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXAgYXJncyA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoYXR0cmliS2V5LCAoTWFwKW51bGwpOwotICAgICAgICAgICAgaWYgKGFyZ3MhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEhhc2hNYXAoYXJncyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXQoa2V5LCBTdHJpbmcudmFsdWVPZihhcmcpKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0cmliS2V5LCBhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQkKLQkvKioKLQkgKiBUaHJvd3MgYSBjb3JlIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBvcHRpb25hbAotCSAqIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbidzIHN0YXR1cyBjb2RlIHdpbGwgaW5kaWNhdGUgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24gY2F1c2Ugb2YgdGhlIGVycm9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCB1bmRlcmx5aW5nCi0JICogIGV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uLCBpbnQgY29kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMmNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbFNlcnZlckJlaGF2aW91ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAKLSAqICAgIEJhc2VkIG9uIEdlbmVyaWNTZXJ2ZXJCZWhhdmlvciBieSBHb3JrZW0gRXJjYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sLlJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotCi0vKioKLSAqIFN1YmNsYXNzIG9mIDxjb2RlPkdlbmVyaWNTZXJ2ZXJCZWhhdmlvcjwvY29kZT4gdGhhdCBzdXBwb3J0cyAKLSAqIHNlcnZlcnMgd2hpY2ggYXJlIHN0YXJ0ZWQvc3RvcHBlZCB2aWEgZXh0ZXJuYWwgZXhlY3V0YWJsZXMgKGUuZy4gc2NyaXB0cykuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbFNlcnZlckJlaGF2aW91ciBleHRlbmRzIEdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIgewotCQotCS8vIGNvbmZpZyBmb3IgZGVidWdnaW5nIHNlc3Npb24KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgZkxhdW5jaENvbmZpZ3VyYXRpb25XQzsKLSAgICBwcml2YXRlIFN0cmluZyBmTW9kZTsKLSAgICBwcml2YXRlIElMYXVuY2ggZkxhdW5jaDsgCi0gICAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3I7Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gcmVzZXQgdGhlIHN0YXR1cyBpZiB0aGUgc3RhdGUgd2FzIHVua25vd24KLSAgICAgKiBAcGFyYW0gZm9yY2UgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0gICAgCXJlc2V0U3RhdHVzKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkpOwotICAgIAlzdXBlci5zdG9wKGZvcmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0byBzZXQgc3RhdHVzIHRvIHVua25vd24gaWYgdGhlIHBvcnQgd2FzIGluIHVzZSBhbmQgdG8gcmVzZXQgdGhlIHN0YXR1cyBpZiB0aGUgc3RhdGUgd2FzIAotICAgICAqIHVua25vd24gYW5kIGFuIGV4Y2VwdGlvbiB3YXMgbm90IHRocm93bi4gV2lsbCB3YW50IHRvIGNoYW5nZSBsb2dpYyBvbmNlIGV4dGVybmFsIGdlbmVyaWMgc2VydmVyIHBpbmdzCi0gICAgICogc2VydmVyIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIHN0YXRlIGluc3RlYWQgb2YgbWFpbnRhaW5pbmcgaGFuZGxlIHRvIHByb2Nlc3MuIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCWludCBzdGF0ZSA9IGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlzdXBlci5zZXR1cExhdW5jaChsYXVuY2gsIGxhdW5jaE1vZGUsIG1vbml0b3IpOwotICAgIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgCQlTZXJ2ZXJQb3J0IHBvcnRJblVzZSA9IHBvcnRJblVzZSgpOwotICAgIAkJaWYgKHBvcnRJblVzZSAhPSBudWxsKSB7Ci0gICAgCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlBvcnQgIiArIHBvcnRJblVzZS5nZXRQb3J0KCkgKyAiIGlzIGN1cnJlbnRseSBpbiB1c2UiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgCi0JCQkJCQkJTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclBvcnRJblVzZSxJbnRlZ2VyLnRvU3RyaW5nKHBvcnRJblVzZS5nZXRQb3J0KCkpLHBvcnRJblVzZS5nZXROYW1lKCkpLCBudWxsKTsKLQkJCQlzZXRTZXJ2ZXJTdGF0dXMoc3RhdHVzKTsKLQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1VOS05PV04pOwotICAgIAkJfQotICAgIAkJdGhyb3cgY2U7Ci0gICAgCX0KLSAgICAJcmVzZXRTdGF0dXMoc3RhdGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNlcnZlclBvcnQgcG9ydEluVXNlKCkgewotICAgIAlTZXJ2ZXJQb3J0W10gcG9ydHMgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJQb3J0cyhudWxsKTsKLSAgICAJU2VydmVyUG9ydCBzcDsKLSAgICAJZm9yKGludCBpPTA7aTxwb3J0cy5sZW5ndGg7aSsrKXsKLSAgICAJCXNwID0gcG9ydHNbaV07Ci0gICAgCQlpZiAoU29ja2V0VXRpbC5pc1BvcnRJblVzZShzcC5nZXRQb3J0KCksIDUpKSB7Ci0gICAgCQkJcmV0dXJuIHNwOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotCX0KLSAgICAKLQkvKioKLQkgKiBPdmVycmlkZSB0byB0cmlnZ2VyIHRoZSBsYXVuY2ggb2YgdGhlIGRlYnVnZ2luZyBzZXNzaW9uIChpZiBhcHByb3ByaWF0ZSkuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldFNlcnZlclN0YXJ0ZWQoKSB7Ci0JCWlmIChmTGF1bmNoQ29uZmlndXJhdGlvbldDICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0dXBTb3VyY2VMb2NhdG9yKCBmTGF1bmNoICk7Ci0JCQkJRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuc3RhcnREZWJ1Z2dpbmcoZkxhdW5jaENvbmZpZ3VyYXRpb25XQywgZk1vZGUsIGZMYXVuY2gsIGZQcm9ncmVzc01vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGZhaWxlZCB0byBzdGFydCBkZWJ1Z2dpbmcsIHNvIHNldCBtb2RlIHRvIHJ1bgotCQkJCXNldE1vZGUoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkJCWZpbmFsIFN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAxLAotCQkJCQkJCUdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JTdGFydGluZ0V4dGVybmFsRGVidWdnaW5nLCBjZSk7IAotCQkJCUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmcsIGNlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY2xlYXJEZWJ1Z2dpbmdDb25maWcoKTsKLQkJCX0KLQkJfQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotIAl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmVwbGFjZSBkZWZhdWx0IHNvdXJjZSBsb2NhdG9yIG9yIGFkZCBhZGRpdGlvbmFsCi0JICogc291cmNlTG9va3VwUGFydGljaXBhbnQsIGlmIG5lY2Vzc2FyeSAKLQkgKiBAcGFyYW0gbGF1bmNoIAl0aGUgSUxhdW5jaCBvYmplY3Qgb2YgdGhlIGRlYnVnIHNlc3Npb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFNvdXJjZUxvY2F0b3IoSUxhdW5jaCBsYXVuY2gpIHsKLSAgICAgICAgLy9ub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiBJZiB0aGUgc2VydmVyIHN0YXRlIGlzIHVua25vd24sIHJlc2V0IHRoZSBzdGF0dXMgdG8gT0sKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRTdGF0dXMoaW50IHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLQkJCXNldFNlcnZlclN0YXR1cyhudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTaW5jZSB0ZXJtaW5hdGUoKSBpcyBjYWxsZWQgZHVyaW5nIHJlc3RhcnQsIG5lZWQgdG8gb3ZlcnJpZGUgdG8KLQkgKiBjYWxsIHNodXRkb3duIGluc3RlYWQgb2YganVzdCBraWxsaW5nIHRoZSBvcmlnaW5hbCBwcm9jZXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlcm1pbmF0ZSgpIHsKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgCi0gICAgCQlyZXR1cm47Ci0gICAgCi0JCS8vIGNhY2hlIGEgcmVmIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MKLQkJSVByb2Nlc3MgY3VycmVudFByb2Nlc3MgPSBwcm9jZXNzOwotCQkvLyBzZXQgdGhlIHByb2Nlc3MgdmFyIHRvIG51bGwgc28gdGhhdCBHZW5lcmljU2VydmVyQmVoYXZpb3Iuc2V0UHJvY2VzcygpCi0JCS8vIHdpbGwgZ3JhYiB0aGUgc3RvcCBleGVjdXRhYmxlIChhbmQgZGVjbGFyZSB0aGUgc2VydmVyIHN0b3BwZWQgd2hlbiBpdCBleGl0cykKLQkJcHJvY2VzcyA9IG51bGw7Ci0KLQkJLy8gZXhlY3V0ZSB0aGUgc3RhbmRhcmQgc2h1dGRvd24KLQkJc2h1dGRvd24oc3RhdGUpOwotCQkKLQkJLy8gaWYgdGhlIHNodXRkb3duIGRpZCBub3QgdGVybWluYXRlIHRoZSBwcm9jZXNzLCBmb3JjaWJseSB0ZXJtaW5hdGUgaXQKLQkJdHJ5IHsKLSAgICAJCWlmIChjdXJyZW50UHJvY2VzcyAhPSBudWxsICYmICFjdXJyZW50UHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSkgewotICAgIAkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQWJvdXQgdG8ga2lsbCBwcm9jZXNzOiAiICsgY3VycmVudFByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJY3VycmVudFByb2Nlc3MudGVybWluYXRlKCk7Ci0gICAgCQkJY3VycmVudFByb2Nlc3MgPSBudWxsOwotICAgIAkJfQotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Iga2lsbGluZyB0aGUgcHJvY2VzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgc3VwZXJjbGFzcyBtZXRob2QgdG8gY29ycmVjdGx5IHNldHVwIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3Igc3RhcnRpbmcgYW4gZXh0ZXJuYWwKLQkgKiBzZXJ2ZXIuCi0JICogQHBhcmFtIHdvcmtpbmdDb3B5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksCi0JCQkJCQkJCQkJIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljbGVhckRlYnVnZ2luZ0NvbmZpZygpOwotCQlTZXJ2ZXJSdW50aW1lIHNlcnZlckRlZiA9IGdldFNlcnZlckRlZmluaXRpb24oKTsKLQkJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBzZXJ2ZXJEZWYuZ2V0UmVzb2x2ZXIoKTsKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLAotCQkJCQlyZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhzZXJ2ZXJEZWYuZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpKTsKLQkJU3RyaW5nIGV4dGVybmFsID0gcmVzb2x2ZXIucmVzb2x2ZVByb3BlcnRpZXMoZ2V0RXh0ZXJuYWxGb3JPUyhzZXJ2ZXJEZWYuZ2V0U3RhcnQoKS5nZXRFeHRlcm5hbCgpKSk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5DT01NQU5ETElORSwgZXh0ZXJuYWwpOwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuREVCVUdfUE9SVCwgCi0JCQkJCXJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKHNlcnZlckRlZi5nZXRTdGFydCgpLmdldERlYnVnUG9ydCgpKSk7Ci0JCS8vIGp1c3QgdXNlIHRoZSBjb21tYW5kbGluZSBmb3Igbm93Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5FWEVDVVRBQkxFX05BTUUsIGV4dGVybmFsKTsKLSAgICAgICAgTWFwIGVudmlyb25WYXJzID0gZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0YXJ0KCkpOwotICAgICAgICBpZighZW52aXJvblZhcnMuaXNFbXB0eSgpKXsKLSAgICAgICAgCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJTGF1bmNoTWFuYWdlci5BVFRSX0VOVklST05NRU5UX1ZBUklBQkxFUyxlbnZpcm9uVmFycyk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nUHJvZ0FyZ3MgID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotICAgICAgICBTdHJpbmcgc2VydmVyUHJvZ0FyZ3MgPSAgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotICAgICAgICBpZihleGlzdGluZ1Byb2dBcmdzPT1udWxsIHx8IGV4aXN0aW5nUHJvZ0FyZ3MuaW5kZXhPZihzZXJ2ZXJQcm9nQXJncyk8MCkgewotICAgICAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLHNlcnZlclByb2dBcmdzKTsKLSAgICAgICAgfQotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgZmlyc3QgZXh0ZXJuYWwgd2hvc2UgIm9zIiBhdHRyaWJ1dGUgbWF0Y2hlcyAoY2FzZSBpbnNlbnNpdGl2ZSkgdGhlIGJlZ2lubmluZyAKLQkgKiBvZiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBPUyAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgU3lzdGVtICJvcy5uYW1lIiBwcm9wZXJ0eSkuIElmCi0JICogbm8gc3VjaCBtYXRjaCBpcyBmb3VuZCwgcmV0dXJucyB0aGUgZmlyc3QgZXh0ZXJuYWwgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIE9TIGF0dHJpYnV0ZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFeHRlcm5hbEZvck9TKExpc3QgZXh0ZXJuYWxzKSB7Ci0JCVN0cmluZyBjdXJyZW50T1MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0JCUV4dGVybmFsIGV4dGVybmFsOwotCQlTdHJpbmcgbWF0Y2hpbmdFeHRlcm5hbCA9IG51bGw7Ci0JCVN0cmluZyBleHRlcm5hbE9TOwotCQlJdGVyYXRvciBpID0gZXh0ZXJuYWxzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJZXh0ZXJuYWw9IChFeHRlcm5hbCkgaS5uZXh0KCk7Ci0JCQlleHRlcm5hbE9TID0gZXh0ZXJuYWwuZ2V0T3MoKTsKLQkJCWlmIChleHRlcm5hbE9TID09IG51bGwpIHsKLQkJCQlpZiAobWF0Y2hpbmdFeHRlcm5hbCA9PSBudWxsKSB7Ci0JCQkJCW1hdGNoaW5nRXh0ZXJuYWwgPSBleHRlcm5hbC5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY3VycmVudE9TLnN0YXJ0c1dpdGgoZXh0ZXJuYWxPUy50b0xvd2VyQ2FzZSgpKSkgewotCQkJCW1hdGNoaW5nRXh0ZXJuYWwgPSBleHRlcm5hbC5nZXRWYWx1ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXRjaGluZ0V4dGVybmFsOwotCX0KLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyBJRCBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSAgICAgKiBAcmV0dXJuIGxhdW5jaFR5cGVJRAotICAgICAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnVHlwZUlEKCkgewotCQlyZXR1cm4gRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuSURfRVhURVJOQUxfTEFVTkNIX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIG5hbWUgb2YgdGhlIHN0b3AgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBsYXVuY2hlck5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0b3BMYXVuY2hOYW1lKCkgewotCQlyZXR1cm4gR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5leHRlcm5hbFN0b3BMYXVuY2hlcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBTdG9wTGF1bmNoQ29uZmlndXJhdGlvbihHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lLCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjKSB7Ci0JCWNsZWFyRGVidWdnaW5nQ29uZmlnKCk7Ci0JCVNlcnZlclJ1bnRpbWUgc2VydmVyRGVmID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotCQlSZXNvbHZlciByZXNvbHZlciA9IHNlcnZlckRlZi5nZXRSZXNvbHZlcigpOyAKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLAotCQkJCQlyZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhzZXJ2ZXJEZWYuZ2V0U3RvcCgpLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkpOwotCQlTdHJpbmcgZXh0ZXJuYWwgPSByZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhnZXRFeHRlcm5hbEZvck9TKHNlcnZlckRlZi5nZXRTdG9wKCkuZ2V0RXh0ZXJuYWwoKSkpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQ09NTUFORExJTkUsIGV4dGVybmFsKTsKLQkJLy8ganVzdCB1c2UgY29tbWFuZGxpbmUgZm9yIG5vdwotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpKTsKLSAgICAgICAgaWYoIWVudmlyb25WYXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsZW52aXJvblZhcnMpOwotICAgICAgICB9Ci0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywKLQkJCQlyZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhzZXJ2ZXJEZWYuZ2V0U3RvcCgpLmdldFByb2dyYW1Bcmd1bWVudHNBc1N0cmluZygpKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5FWEVDVVRBQkxFX05BTUUsIGV4dGVybmFsKTsgCQotCQl3Yy5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCBnZXRTZXJ2ZXIoKS5nZXRJZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGxhdW5jaGluZyBhIGRlYnVnZ2luZyBzZXNzaW9uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldERlYnVnZ2luZ0NvbmZpZyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjLAotCQkJCQkgCQkJICAgICAgU3RyaW5nIG1vZGUsCi0JCQkJCSAJCQkgICAgICBJTGF1bmNoIGxhdW5jaCwgCi0JCQkJCSAJCQkgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5mTGF1bmNoQ29uZmlndXJhdGlvbldDID0gd2M7Ci0JCXRoaXMuZk1vZGUgPSBtb2RlOwotCQl0aGlzLmZMYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMuZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJEZWJ1Z2dpbmdDb25maWcoKSB7Ci0JCXRoaXMuZkxhdW5jaENvbmZpZ3VyYXRpb25XQyA9IG51bGw7Ci0JCXRoaXMuZk1vZGUgPSBudWxsOwotCQl0aGlzLmZMYXVuY2ggPSBudWxsOwotCQl0aGlzLmZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNQdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNQdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhODc4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHB1Ymxpc2hlci4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5Ci0gKiBjbGllbnRzIGltcGxlbWVudGluZyB0aGUgZ2VuZXJpY3B1Ymxpc2hlciBleHRlbnNpb24gcG9pbnQuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNQdWJsaXNoZXIgCi17Ci0gICAgCi0gICAgcHJpdmF0ZSBJTW9kdWxlW10gZk1vZHVsZTsKLSAgICBwcml2YXRlIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGZTZXJ2ZXJSdW50aW1lOwotICAgIHByaXZhdGUgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotICAgIHByaXZhdGUgaW50IGZLaW5kOwotICAgIHByaXZhdGUgaW50IGZEZWx0YUtpbmQ7Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogSW50aXppbGF6ZXMgcHVibGlzaGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2R1bGUKLSAgICAgKiBAcGFyYW0gc2VydmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSggSU1vZHVsZVtdIG1vZHVsZSwgSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBpbnQgZGVsdGFLaW5kICkKLSAgICB7Ci0gICAgICAgIGZNb2R1bGUgPSBtb2R1bGU7Ci0gICAgICAgIGZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcyxudWxsKTsKLSAgICAgICAgZlNlcnZlclJ1bnRpbWUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpc2VydmVyLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxudWxsKTsKLSAgICAgICAgZktpbmQgPSBraW5kOwotICAgICAgICBmRGVsdGFLaW5kID0gZGVsdGFLaW5kOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBwdWJsaXNoZXIuCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICogQHBhcmFtIHNlcnZlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSU1vZHVsZVtdIG1vZHVsZSwgSVNlcnZlciBzZXJ2ZXIpCi0gICAgewotICAgICAgICBmTW9kdWxlID0gbW9kdWxlOwotICAgICAgICBmU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpc2VydmVyLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXIuY2xhc3MsbnVsbCk7Ci0gICAgICAgIGZTZXJ2ZXJSdW50aW1lID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKXNlcnZlci5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0gICAgfQotICAgLyoqCi0gICAgKiBDYWxsZWQgYnkgdGhlIGdlbmVyaWMgc2VydmVyIGltcGxlbWVudGF0aW9uIHdoZW4gYSBtb2R1bGUgaXMgCi0gICAgKiByZW1vdmVkIGZvcm0gdGhlIHNlcnZlciBpbnN0YW5jZS4gCi0gICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gbW9kdWxlIHJlbW92YWwKLSAgICAqIAotICAgICogQHBhcmFtIG1vbml0b3IKLSAgICAqIEByZXR1cm4gc3RhdHVzCi0gICAgKi8gCi0gICBwdWJsaWMgYWJzdHJhY3QgSVN0YXR1c1tdIHVucHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgZ2VuZXJpYyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlbiBhIHB1Ymxpc2ggbW9kdWxlIAotICAgICAqIGV2ZW50IG9jY3Vycy4gCi0gICAgICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhlaXIgb3duIHB1Ymxpc2hpbmcKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICAqIEByZXR1cm4gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IElTdGF0dXNbXSBwdWJsaXNoKElNb2R1bGVBcnRpZmFjdFtdIHJlc291cmNlLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLSAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdWJsaXNoZXIgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIG1vZHVsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJTW9kdWxlW10gZ2V0TW9kdWxlKCkgewotICAgICAgICByZXR1cm4gZk1vZHVsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmljIHNlcnZlciBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gc2VydmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdlbmVyaWNTZXJ2ZXIgZ2V0U2VydmVyKCl7Ci0gICAgCXJldHVybiBmU2VydmVyOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBhIGhhbmRsZSB0byBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAgICAgKiBAcmV0dXJuIHNlcnZlcmRlZgotICAgICAqLwotICAgIHByb3RlY3RlZCBHZW5lcmljU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJSdW50aW1lKCkgewotICAgICAgICByZXR1cm4gZlNlcnZlclJ1bnRpbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXREZWx0YUtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBmRGVsdGFLaW5kOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0S2luZCgpIHsKLSAgICAgICAgcmV0dXJuIGZLaW5kOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGJjZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUVudGVycHJpc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGU7Ci0KLS8qKgotICogR2VuZXJpYyBYTUwgYmFzZWQgc2VydmVyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFByb3BlcnR5IGtleSBmb3IgdGhlIGN1c3RvbSBidWlsZCBmaWxlLiBTZWxlY3RlZCBieSB1c2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCA9IENvcmVQbHVnaW4uUExVR0lOX0lEKyIuY3VzdG9tX2J1aWxkX2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfR0VORVJJQ19TRVJWRVJfTU9EVUxFUyA9ICJHZW5lcmljX1NlcnZlcl9Nb2R1bGVzX0xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKCBJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlICkgewotICAgICAgICBpZiggYWRkICE9IG51bGwgKS8vIHJlbW92ZSBpcyBPSy4KLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGQubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXNTdXBwb3J0ZWRNb2R1bGUoIGFkZFtpXSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLm1vZHVsZU5vdENvbXBhdGlibGUsIG51bGwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIGFkZFtpXS5nZXRQcm9qZWN0KCkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IEZhY2V0VXRpbC52ZXJpZnlGYWNldHMoIGFkZFtpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0KCksIGdldFNlcnZlcigpICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydGVkTW9kdWxlKElNb2R1bGUgbW9kdWxlKXsKLSAgICAgICAgaWYoIG1vZHVsZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgTGlzdCBtb2R1bGVUeXBlcyA9IGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRNb2R1bGUoKTsKLSAgICAgICAgZm9yKCBpbnQgaj0wOyBqPG1vZHVsZVR5cGVzLnNpemUoKTsgaisrICl7Ci0gICAgICAgICAgICAgTW9kdWxlIG1vZHVsZURlZmluaXRpb24gPSAoTW9kdWxlKW1vZHVsZVR5cGVzLmdldChqKTsKLSAgICAgICAgICAgICBpZiggbW9kdWxlLmdldE1vZHVsZVR5cGUoKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMobW9kdWxlRGVmaW5pdGlvbi5nZXRUeXBlKCkpICl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGUjbW9kaWZ5TW9kdWxlcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCi0gICAgICAgIExpc3QgbW9kdWxlcyA9IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJfR0VORVJJQ19TRVJWRVJfTU9EVUxFUywoTGlzdCludWxsKTsKLSAgICAgICAgCi0gICAgICAgIGlmKGFkZCE9bnVsbCYmIGFkZC5sZW5ndGg+MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobW9kdWxlcz09bnVsbCkgewotICAgICAgICAgICAgICAgbW9kdWxlcz1uZXcgQXJyYXlMaXN0KGFkZC5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgaWYobW9kdWxlcy5jb250YWlucyhhZGRbaV0uZ2V0SWQoKSk9PWZhbHNlKQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChhZGRbaV0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocmVtb3ZlIT1udWxsICYmIHJlbW92ZS5sZW5ndGg+MCAmJiBtb2R1bGVzIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1vZHVsZXMucmVtb3ZlKHJlbW92ZVtpXS5nZXRJZCgpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobW9kdWxlcyE9bnVsbCkgICAgCi0gICAgICAgICAgICBzZXRBdHRyaWJ1dGUoQVRUUl9HRU5FUklDX1NFUlZFUl9NT0RVTEVTLG1vZHVsZXMpOwotICAgICAgICAKLSAgICB9Ci0KLSAJLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVNlcnZlckRlbGVnYXRlI2dldENoaWxkTW9kdWxlcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZVswXSAhPSBudWxsICYmIG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCkgIT0gbnVsbCkgewotCQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSkgewotCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBtb2R1bGVbMF0uZ2V0TW9kdWxlVHlwZSgpOwotCQkJCWlmIChtb2R1bGVUeXBlICE9IG51bGwgJiYgImpzdC5lYXIiLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlbnRlcnByaXNlQXBwbGljYXRpb24gPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlWzBdCi0JCQkJCQkJLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsIG51bGwpOwotCQkJCQlpZiAoZW50ZXJwcmlzZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUlNb2R1bGVbXSBlYXJNb2R1bGVzID0gZW50ZXJwcmlzZUFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsgCi0JCQkJCQlpZiAoIGVhck1vZHVsZXMgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlYXJNb2R1bGVzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCAmJiAianN0LndlYiIuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGVbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSB3ZWJNb2R1bGUuZ2V0TW9kdWxlcygpOwotCQkJCQkJcmV0dXJuIG1vZHVsZXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluY2x1ZGluZyBydW50aW1lIHByb3BlcnRpZXMuIAotCSAqIAotCSAqIEByZXR1cm4gc2VydmVyIGluc3RhbmNlIHByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCkgewotCQlNYXAgcnVudGltZVByb3BlcnRpZXMgPWdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpOwotCQlNYXAgc2VydmVyUHJvcGVydGllcyA9IGdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpOwotCQlNYXAgaW5zdGFuY2VQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAocnVudGltZVByb3BlcnRpZXMuc2l6ZSgpK3NlcnZlclByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJaW5zdGFuY2VQcm9wZXJ0aWVzLnB1dEFsbChydW50aW1lUHJvcGVydGllcyk7Ci0JCWluc3RhbmNlUHJvcGVydGllcy5wdXRBbGwoc2VydmVyUHJvcGVydGllcyk7Ci0JCXJldHVybiBpbnN0YW5jZVByb3BlcnRpZXM7Ci0JfQotCQotIAkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9uaXRvcmFibGVTZXJ2ZXIjZ2V0U2VydmVyUG9ydHMoKQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBwSXRlciA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFBvcnQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlQb3J0IGVsZW1lbnQgPSAoUG9ydCkgcEl0ZXIubmV4dCgpOwotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGVsZW1lbnQuZ2V0Tm8oKSkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBlbGVtZW50LmdldE5hbWUoKSwgcG9ydCwgZWxlbWVudC5nZXRQcm90b2NvbCgpKSk7CQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0JCXJldHVybiAob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnRbXSlwb3J0cy50b0FycmF5KG5ldyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydFtwb3J0cy5zaXplKCldKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXIjZ2V0TW9kdWxlUm9vdFVSTChvcmcuZWNsaXBzZS53dHAuc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldE1vZHVsZVJvb3RVUkwoSU1vZHVsZSBtb2R1bGUpIHsKLQotCQl0cnkgewotICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLG51bGwpPT1udWxsICkKLQkJCQlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPShJV2ViTW9kdWxlKW1vZHVsZS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBnZXRTZXJ2ZXIoKS5nZXRIb3N0KCk7Ci0JCQlTdHJpbmcgdXJsID0gImh0dHA6Ly8iK2hvc3Q7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBwb3J0ID0gMDsKLQkJCQotCQkJcG9ydCA9IGdldEh0dHBQb3J0KCk7Ci0JCQlwb3J0ID1TZXJ2ZXJVdGlsLmdldE1vbml0b3JlZFBvcnQoZ2V0U2VydmVyKCksIHBvcnQsICJ3ZWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdXJsICs9ICI6IiArIHBvcnQ7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nIGN0eFJvb3QgPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCWlmKCFjdHhSb290LnN0YXJ0c1dpdGgoICIvIiApKXsgLy8kTk9OLU5MUy0xJAotCQkJICAgIHVybCArPSAnLyc7Ci0JCQl9Ci0JCQl1cmwgKz0gd2ViTW9kdWxlLmdldENvbnRleHRSb290KCk7Ci0KLQkJCWlmICghdXJsLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl1cmwgKz0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQkJCXJldHVybiBuZXcgVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZSgiQ291bGQgbm90IGdldCByb290IFVSTCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGh0dHAgcG9ydAotCSAqIEByZXR1cm4gcG9ydAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SHR0cFBvcnQoKSB7Ci0JCWludCBwb3J0PS0xOwotCQlJdGVyYXRvciBwSXRlciA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFBvcnQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlQb3J0IGFQb3J0ID0gKFBvcnQpIHBJdGVyLm5leHQoKTsKLQkJCWlmKHBvcnQ9PSAtMSkKLQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhhUG9ydC5nZXRObygpKSk7Ci0JCQllbHNlIGlmKCAiaHR0cCIuZXF1YWxzKGFQb3J0LmdldFByb3RvY29sKCkgKSApIC8vJE5PTi1OTFMtMSQKLQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChhUG9ydC5nZXRObygpKTsJCi0JCX0KLQkJaWYoIHBvcnQgPT0gLTEpCi0JCQlwb3J0ID0gODA4MDsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2VydmVyUnVudGltZSB0aGF0IHJlcHJlc2VudHMgdGhlIC5zZXJ2ZXJkZWYKLQkgKiBmaWxlIGZvciB0aGlzIHNlcnZlci4gCi0JICogQHJldHVybiBzZXJ2ZXIgcnVudGltZQotCSAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlckRlZmluaXRpb24oKXsKLSAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBzZXJ2ZXIgZGV0ZXJtZWluZWQuIFNlcnZlciBkZWZpbml0aW9uIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0IGEgc2VydmVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJ0VHlwZUlkPW51bGw7Ci0gICAgICAgIGlmICggc2VydmVyLmdldFJ1bnRpbWUoKSAhPSBudWxsICYmCi0gICAgICAgIAkJc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgIAlydFR5cGVJZCA9IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICB9Ci0JCQotICAgICAgICBTdHJpbmcgc2VydmVyVHlwZUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAvKioKLSAgICAgICAgICogUGFzcyBib3RoIHRoZSBzZXJ2ZXJUeXBlIGlkIGFuZCBydW50aW1lVHlwZSBpZCBhbmQgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyIAotICAgICAgICAgKiB3aWxsIGZpZ3VyZSBvdXQgaG93IHRvIGdpdmUgdXMgYmFjayB0aGUgY29ycmVjdCBTZXJ2ZXJSdW50aW1lLgotICAgICAgICAgKi8KLQkJcmV0dXJuIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpLmdldFNlcnZlclJ1bnRpbWVEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgIHNlcnZlclR5cGVJZCwgcnRUeXBlSWQsIGdldEluc3RhbmNlUHJvcGVydGllcygpKTsKLQl9Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpewotICAgIAlyZXR1cm4gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKWdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxudWxsKTsKLSAgICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSNnZXRSb290TW9kdWxlcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgIAlpZiAoICFpc1N1cHBvcnRlZE1vZHVsZSggbW9kdWxlICkgKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0gICAgICAgICAgICB0aHJvdyAgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTs7Ci0gICAgICAgIElNb2R1bGVbXSBwYXJlbnRzID0gZG9HZXRQYXJlbnRNb2R1bGVzKG1vZHVsZSk7Ci0gICAgICAgIGlmKHBhcmVudHMubGVuZ3RoPjApCi0gICAgICAgIAlyZXR1cm4gcGFyZW50czsKLSAgICAgICAgcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLSAgICB9Ci0KLQotCXByaXZhdGUgSU1vZHVsZVtdIGRvR2V0UGFyZW50TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgewotCQlJTW9kdWxlW10gZWFycyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcygianN0LmVhciIpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFbnRlcnByaXNlQXBwbGljYXRpb24gZWFyID0gKElFbnRlcnByaXNlQXBwbGljYXRpb24pZWFyc1tpXS5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLG51bGwpOwotCQkJSU1vZHVsZVtdIGNoaWxkcyA9IGVhci5nZXRNb2R1bGVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcy5sZW5ndGg7IGorKykgewotCQkJCWlmKGNoaWxkc1tqXS5lcXVhbHMobW9kdWxlKSkKLQkJCQkJbGlzdC5hZGQoZWFyc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJTW9kdWxlW10pbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBwcm9wZXJ0aWVzLgotCSAqIEByZXR1cm4gTWFwIG9mIHByb3BlcnRpZXMuCi0JICovCi0gICAgcHVibGljIE1hcCBnZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKSB7Ci0gCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLCBuZXcgSGFzaE1hcCgpKTsKLSAJfQotIAkvKioKLSAJICogQ2hhbmdlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgcHJvcGVydGllcy4KLSAJICogCi0gCSAqIEBwYXJhbSBtYXAKLSAJICovCi0gCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhNYXAgbWFwKSB7Ci0gCQlzZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsIG1hcCk7Ci0gCX0KLSAJLyoqCi0gCSAqIENoZWNrcyBpZiB0aGUgcHJvcGVydGllcyBzZXQgZm9yIHRoaXMgc2VydmVyIGlzIHZhbGlkLiAKLSAJICogQHJldHVybiBzdGF0dXMKLSAJICovCi0gCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotIAkJTGlzdCBwcm9wcyA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7Ci0gCQlmb3IoaW50IGk9MDtpPHByb3BzLnNpemUoKTtpKyspCi0gCQl7Ci0gCQkJUHJvcGVydHkgcHJvcGVydHkgPShQcm9wZXJ0eSlwcm9wcy5nZXQoaSk7Ci0gCQkJaWYocHJvcGVydHkuZ2V0VHlwZSgpLmVxdWFscyhQcm9wZXJ0eS5UWVBFX0RJUkVDVE9SWSkgfHwgcHJvcGVydHkuZ2V0VHlwZSgpLmVxdWFscyhQcm9wZXJ0eS5UWVBFX0ZJTEUpKQotIAkJCXsKLSAJCQkJU3RyaW5nIHBhdGg9IChTdHJpbmcpZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCkuZ2V0KHByb3BlcnR5LmdldElkKCkpOwotIAkJCQlpZihwYXRoIT1udWxsICYmICFwYXRoRXhpc3QocGF0aCkpCi0gCQkJCQlyZXR1cm4gIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuaW52YWxpZFBhdGgscGF0aCksIG51bGwpOwotIAkJCX0KLSAJCX0KLSAJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAJfQotCXByaXZhdGUgYm9vbGVhbiBwYXRoRXhpc3QoU3RyaW5nIHBhdGgpewotCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJcmV0dXJuIGYuZXhpc3RzKCk7Ci0JfQotIAotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTZXJ2ZXJSdW50aW1lIHNlcnZlclJ1bnRpbWUgPSAgdGhpcy5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7IAotCQkvLyBhbHRob3VnaCBhIHNlcnZlciBzaG91bGQgYWx3YXlzIGhhdmUgYSBzZXJ2ZXJkZWZpbml0aW9uIGluIHNvbWUgY2FzZXMgCi0JCS8vIHRoZSBydW50aW1lIGlzIG5vdCBjcmVhdGVkIHlldCBhbmQgc2VydmVyZGVmIGNhbiBub3QgYmUgZGV0ZXJtaW5lZC4KLQkJaWYgKHNlcnZlclJ1bnRpbWUgPT0gbnVsbCApewotCQkJcmV0dXJuIDsKLQkJfQotIAkJTGlzdCBwcm9wcyA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7Ci0gCQlNYXAgaW5zdGFuY2VQcm9wc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb3BlcnR5IGVsZW1lbnQgPSAoUHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJaWYoUHJvcGVydHkuQ09OVEVYVF9TRVJWRVIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldENvbnRleHQoKSkpIHsKLQkJCQkvL2lmIHRoZSBwcm9wZXJ0eSB0eXBlIGlzIHRoaXMgaXMgYSBjb21ibywgcGFyc2UgdGhlIHZhbHVlIGFuZCB1c2UgdGhlIGZpcnN0IHRva2VuIGFzIHRoZSBkZWZhdWx0Ci0JCQkJaWYgKFByb3BlcnR5LlRZUEVfU0VMRUNULmVxdWFscyhlbGVtZW50LmdldFR5cGUoKSkgfHwKLQkJCQkJCVByb3BlcnR5LlRZUEVfU0VMRUNUX0VESVQuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSkgewotCQkgICAgCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldERlZmF1bHQoKSwiLCIpOyAvLyROT04tTkxTLTEkCi0JCSAgICAJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCSAgICAJCQlTdHJpbmcgZmlyc3RUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJICAgIAkJCWluc3RhbmNlUHJvcHNNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZmlyc3RUb2tlbik7Ci0JCSAgICAJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvL25vdCBhIGNvbWJvLCBzbyBqdXN0IHBhc3MgdGhyb3VnaCB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJCQlpbnN0YW5jZVByb3BzTWFwLnB1dChlbGVtZW50LmdldElkKCksIGVsZW1lbnQuZ2V0RGVmYXVsdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAJCXNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhpbnN0YW5jZVByb3BzTWFwKTsKLSAJfQotIAkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2Y0YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckJlaGF2aW91ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuRGVsZXRlZE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0KLS8qKgotICogU2VydmVyIGJlaGF2aW9yIGRlbGVnYXRlIGltcGxlbWVudGF0aW9uIGZvciBnZW5lcmljIHNlcnZlci4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NUT1AgPSAic3RvcC1zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJWRVJfSUQgPSAic2VydmVyLWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIHRoZSB0aHJlYWQgdXNlZCB0byBwaW5nIHRoZSBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFBpbmdUaHJlYWQgcGluZzsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgcHJvY2Vzc0xpc3RlbmVyOwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgSVByb2Nlc3MgcHJvY2VzczsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUjcHVibGlzaFNlcnZlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoU2VydmVyKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNwdWJsaXNoTW9kdWxlKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlW10sIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoTW9kdWxlKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEdlbmVyaWNQdWJsaXNoZXIgcHVibGlzaGVyID0gaW5pdGlhbGl6ZVB1Ymxpc2hlcigga2luZCwgZGVsdGFLaW5kLCBtb2R1bGUgKTsKLSAgICAgICAgSVN0YXR1c1tdIHN0YXR1cyA9IG51bGw7Ci0gICAgCWlmKFJFTU9WRUQgPT0gZGVsdGFLaW5kICl7Ly9UT0RPOiBjaGVjayBpZiB0aGUgcmVtb3ZlZCBtb2R1bGUgaXMgcHVibGlzaGVkIHRvIHNlcnZlcgotICAgICAgICAgICAgc3RhdHVzID0gcHVibGlzaGVyLnVucHVibGlzaChtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlewotICAgICAgICAJY2hlY2tDbG9zZWQobW9kdWxlKTsKLSAgICAgICAgICAgIHN0YXR1cz0gcHVibGlzaGVyLnB1Ymxpc2gobnVsbCxtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICBzZXRNb2R1bGVQdWJsaXNoU3RhdGUoIG1vZHVsZSwgc3RhdHVzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZSggSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1c1tdIHN0YXR1cyApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoIG1vZHVsZT09bnVsbCApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciggaW50IGk9MDsgaSA8IG1vZHVsZS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoc3RhdHVzID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmxlbmd0aCA8IGkgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzW2ldPT1udWxsIHx8IAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNbaV0uZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBJU3RhdHVzLkVSUk9SID09IHN0YXR1c1tpXS5nZXRTZXZlcml0eSgpICl7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZSggbW9kdWxlLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfVU5LTk9XTiApOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3RhdHVzW2ldICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKElNb2R1bGVbXSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgIAlmb3IoIGludCBpPTA7IGkgPCBtb2R1bGUubGVuZ3RoOyBpKysgKXsKLSAgICAJCWlmKCBtb2R1bGVbaV0gaW5zdGFuY2VvZiBEZWxldGVkTW9kdWxlICl7CQotICAgICAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLENvcmVQbHVnaW4uUExVR0lOX0lELDAsIE5MUy5iaW5kKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuY2FuTm90UHVibGlzaERlbGV0ZWRNb2R1bGUsbW9kdWxlW2ldLmdldE5hbWUoKSksbnVsbCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIHByaXZhdGUgR2VuZXJpY1B1Ymxpc2hlciBpbml0aWFsaXplUHVibGlzaGVyKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlICkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHVibGlzaGVySWQgPSBTZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwuZ2V0UHVibGlzaGVySUQobW9kdWxlWzBdLCBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkpOwotICAgICAgICBHZW5lcmljUHVibGlzaGVyIHB1Ymxpc2hlciA9IFB1Ymxpc2hNYW5hZ2VyLmdldFB1Ymxpc2hlcihwdWJsaXNoZXJJZCk7ICAKLSAgICAgICAgaWYocHVibGlzaGVyPT1udWxsKXsKLSAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLENvcmVQbHVnaW4uUExVR0lOX0lELDAsTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy51bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcixwdWJsaXNoZXJJZCksbnVsbCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHB1Ymxpc2hlci5pbml0aWFsaXplKCBtb2R1bGUsZ2V0U2VydmVyKCksIGtpbmQsIGRlbHRhS2luZCApOwotICAgICAgICByZXR1cm4gcHVibGlzaGVyOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUjc3RvcChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoZm9yY2UpIHsKLQkJCXRlcm1pbmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQl0ZXJtaW5hdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2h1dGRvd24oc3RhdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTaHV0cyBkb3duIHRoZSBzZXJ2ZXIgdmlhIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bihpbnQgc3RhdGUpIHsKLQkJR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpOwotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RvcHBpbmcgU2VydmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUElORyk7Ci0JCQlTdHJpbmcgY29uZmlnVHlwZUlEID0gZ2V0Q29uZmlnVHlwZUlEKCk7IAotCQkJSUxhdW5jaE1hbmFnZXIgbWdyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gbWdyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKGNvbmZpZ1R5cGVJRCk7Ci0JCQlTdHJpbmcgbGF1bmNoTmFtZSA9IGdldFN0b3BMYXVuY2hOYW1lKCk7Ci0JCQlTdHJpbmcgdW5pcXVlTGF1bmNoTmFtZSA9IG1nci5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbShsYXVuY2hOYW1lKTsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmYgPSBudWxsOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBsY2ggPSBtZ3IuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnModHlwZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxjaC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsYXVuY2hOYW1lLmVxdWFscyhsY2hbaV0uZ2V0TmFtZSgpKSkgewotCQkJCQljb25mID0gbGNoW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCQkJaWYgKGNvbmYgIT0gbnVsbCkgewotCQkJCXdjID0gY29uZi5nZXRXb3JraW5nQ29weSgpOwotCQkJfSBlbHNlIHsKLQkJCQl3YyA9IHR5cGUubmV3SW5zdGFuY2UobnVsbCwgdW5pcXVlTGF1bmNoTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIFRvIHN0b3AgZnJvbSBhcHBlYXJpbmcgaW4gaGlzdG9yeSBsaXN0cwotCQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfUFJJVkFURSwgdHJ1ZSk7CQkKLQkJCS8vIFNldCB0aGUgc3RvcCBhdHRyaWJ1dGUgc28gdGhhdCB3ZSBrbm93IHdlIGFyZSBzdG9wcGluZwotCQkJd2Muc2V0QXR0cmlidXRlKEFUVFJfU1RPUCwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gU2V0IHRoZSBzZXJ2ZXIgSUQgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggc3RvcHMKLQkJCXdjLnNldEF0dHJpYnV0ZSggQVRUUl9TRVJWRVJfSUQsIHRoaXMuZ2V0U2VydmVyKCkuZ2V0SWQoKSk7Ci0JCQkvLyBTZXR1cCB0aGUgbGF1bmNoIGNvbmZpZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgotCQkJc2V0dXBTdG9wTGF1bmNoQ29uZmlndXJhdGlvbihydW50aW1lLCB3Yyk7Ci0JCQkKLQkJCS8vIExhdW5jaCB0aGUgc3RvcCBsYXVuY2ggY29uZmlnCi0JCQl3Yy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBTZXJ2ZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIElEIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlLgotICAgICAqIEByZXR1cm4gaWQKLSAgICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1R5cGVJRCgpIHsKLQkJcmV0dXJuIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9KQVZBX0FQUExJQ0FUSU9OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyBuYW1lIG9mIHRoZSBzdG9wIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIEByZXR1cm4gbGF1bmNobmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RvcExhdW5jaE5hbWUoKSB7Ci0JCXJldHVybiAiR2VuZXJpY1NlcnZlclN0b3BwZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZSgpewotCQlyZXR1cm4gKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkmJiAhU29ja2V0VXRpbC5pc0xvY2FsaG9zdChnZXRTZXJ2ZXIoKS5nZXRIb3N0KCkpICk7Ci0JfQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFN0b3BMYXVuY2hDb25maWd1cmF0aW9uKEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MpIHsKLQkJaWYoaXNSZW1vdGUoKSkvLyBEbyBub3QgbGF1bmNoIGZvciByZW1vdGUgc2VydmVycy4KLQkJCXJldHVybjsKLQkJCi0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwKLQkJCQlnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyh0aGlzLmdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkuZ2V0TWFpbkNsYXNzKCkpKTsKLQotCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCk7Ci0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX1RZUEUsIHJ1bnRpbWUKLQkJCQkJCS5nZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX05BTUUsCi0JCQkJdm1JbnN0YWxsLmdldE5hbWUoKSk7Ci0KLQkJc2V0dXBMYXVuY2hDbGFzc3BhdGgod2MsIHZtSW5zdGFsbCwgZ2V0U3RvcENsYXNzcGF0aCgpKTsKLQotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpKTsKLSAgICAgICAgaWYoIWVudmlyb25WYXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsZW52aXJvblZhcnMpOwotICAgICAgICB9Ci0gICAgICAgIAotCQl3Yy5zZXRBdHRyaWJ1dGUoCi0JCQkJSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksCi0JCQkJZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0b3AoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAotCQkJCWdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FzU3RyaW5nKCkpKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywKLQkJCQlnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpLmdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCkpKTsJCQkJCi0JfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2xhc3MgbmFtZQotICAgICAqIEByZXR1cm4gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRDbGFzc05hbWUoKSB7Ci0gICAgCXJldHVybiBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRNYWluQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNlcnZlciBkZWZpbml0aW9uCi0gICAgICogQHJldHVybiBzZXJ2ZXJkZWYKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkgewotICAgICAgICBHZW5lcmljU2VydmVyIHNlcnZlciA9IChHZW5lcmljU2VydmVyKWdldFNlcnZlcigpLmxvYWRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBHZW5lcmljU2VydmVyUnVudGltZSBnZXRSdW50aW1lRGVsZWdhdGUoKSB7Ci0gICAgICAgcmV0dXJuIChHZW5lcmljU2VydmVyUnVudGltZSlnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldFN0YXJ0Q2xhc3NwYXRoKCkgewotICAgIAlTdHJpbmcgY3BSZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLSAgICAJcmV0dXJuIHNlcnZlckNsYXNzcGF0aChjcFJlZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNwUmVmCi0gICAgICogQHJldHVybiBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBzZXJ2ZXJDbGFzc3BhdGgoU3RyaW5nIGNwUmVmKSB7Ci0gICAgCXJldHVybiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwuZ2V0Q2xhc3NwYXRoRW50cmllcyhjcFJlZiwgZ2V0U2VydmVyRGVmaW5pdGlvbigpLHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3YwotICAgICAqIEBwYXJhbSB2bUluc3RhbGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cExhdW5jaENsYXNzcGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjLCBJVk1JbnN0YWxsIHZtSW5zdGFsbCwgTGlzdCBjcCkgewotCQkvL21lcmdlIGV4aXN0aW5nIGNsYXNzcGF0aCB3aXRoIHNlcnZlciBjbGFzc3BhdGgKLQkJdHJ5IHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBleGlzdGluZ0NwcyA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aCh3Yyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nQ3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoY3AuY29udGFpbnMoZXhpc3RpbmdDcHNbaV0pPT1mYWxzZSl7IAotCQkJCQljcC5hZGQoZXhpc3RpbmdDcHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLSAgICAJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTUEFUSCwgY29udmVydENQRW50cnlUb01lbWVudG8oY3ApKTsKLSAgICAJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILGZhbHNlKTsKLSAgICB9Ci0KLQlwcml2YXRlIExpc3QgY29udmVydENQRW50cnlUb01lbWVudG8oTGlzdCBjcEVudHJ5TGlzdCkKLQl7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoY3BFbnRyeUxpc3Quc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcEVudHJ5TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpCi0JCXsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldE1lbWVudG8oKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCkgewotICAgIAlyZXR1cm4gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0YXJ0KCkuZ2V0V29ya2luZ0RpcmVjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2dyYW1Bcmd1bWVudHMoKSB7Ci0gICAgCXJldHVybiBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyl7Ci0gICAgICAgIExpc3QgdmFyaWFibGVzID0gY29uZmlnLmdldEVudmlyb25tZW50VmFyaWFibGUoKTsKLSAgICAgICAgTWFwIHZhcnNNYXAgPSBuZXcgSGFzaE1hcCh2YXJpYWJsZXMuc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3I9IHZhcmlhYmxlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAgICAgICAJQXJndW1lbnRQYWlyIHBhaXIgPSAoQXJndW1lbnRQYWlyKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgCXZhcnNNYXAucHV0KHBhaXIuZ2V0TmFtZSgpLGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKHBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YXJzTWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRWbUFyZ3VtZW50cygpIHsKLSAgICAJcmV0dXJuIGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoaXNSZW1vdGUoKSkvLyBObyBsYXVuY2ggZm9yIHJlbW90ZSBzZXJ2ZXJzLgotCQkJcmV0dXJuOwotICAgIAkKLSAgICAJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotICAgICAgICAgICAgICAgIGdldFN0YXJ0Q2xhc3NOYW1lKCkpOwotCi0gICAgICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSBnZXRSdW50aW1lRGVsZWdhdGUoKTsKLQotICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCk7Ci0gICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX1RZUEUsIHJ1bnRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0gICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX05BTUUsCi0gICAgICAgICAgICAgICAgdm1JbnN0YWxsLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgc2V0dXBMYXVuY2hDbGFzc3BhdGgod29ya2luZ0NvcHksIHZtSW5zdGFsbCwgZ2V0U3RhcnRDbGFzc3BhdGgoKSk7Ci0KLQotICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksCi0gICAgICAgICAgICAgICAgZ2V0V29ya2luZ0RpcmVjdG9yeSgpKTsKLSAgICAgICAgCi0KLSAgICAgICAgTWFwIGVudmlyb25WYXJzID0gZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0YXJ0KCkpOwotICAgICAgICBpZighZW52aXJvblZhcnMuaXNFbXB0eSgpKXsKLSAgICAgICAgCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJTGF1bmNoTWFuYWdlci5BVFRSX0VOVklST05NRU5UX1ZBUklBQkxFUyxlbnZpcm9uVmFycyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBleGlzdGluZ1Byb2dBcmdzICA9IHdvcmtpbmdDb3B5LmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlclByb2dBcmdzID0gIGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLSAgICAgICAgaWYoIGV4aXN0aW5nUHJvZ0FyZ3M9PW51bGwgKSB7Ci0gICAgICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsc2VydmVyUHJvZ0FyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleGlzdGluZ1ZNQXJncyA9IHdvcmtpbmdDb3B5LmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsKFN0cmluZyludWxsKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlclZNQXJncz0gZ2V0Vm1Bcmd1bWVudHMoKTsKLSAgICAgICAgaWYoIGV4aXN0aW5nVk1BcmdzPT1udWxsICkgewotICAgICAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUyxzZXJ2ZXJWTUFyZ3MpOwotICAgICAgICB9Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHVwIGZvciBzdGFydGluZyB0aGUgc2VydmVyLiBDaGVja3MgYWxsIHBvcnRzIGF2YWlsYWJsZSAKLSAgICAgKiBhbmQgc2V0cyBzZXJ2ZXIgc3RhdGUgYW5kIG1vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhdW5jaCBJTGF1bmNoCi0gICAgICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCi0gICAgICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCWlmICgidHJ1ZSIuZXF1YWxzKGxhdW5jaC5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKEFUVFJfU1RPUCwgImZhbHNlIikpKSAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCQlyZXR1cm47Ci0KLSAgICAJU3RyaW5nIGhvc3QgPSBnZXRTZXJ2ZXIoKS5nZXRIb3N0KCk7Ci0gICAgCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFNlcnZlcigpLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgIAlTZXJ2ZXJQb3J0IHNwID0gbnVsbDsKLSAgICAJaWYoU29ja2V0VXRpbC5pc0xvY2FsaG9zdChob3N0KSl7Ci0JICAgIAlmb3IoaW50IGk9MDtpPHBvcnRzLmxlbmd0aDtpKyspewotCSAgICAJCXNwPSBwb3J0c1tpXTsKLQkgICAgCQlpZiAoU29ja2V0VXRpbC5pc1BvcnRJblVzZShwb3J0c1tpXS5nZXRQb3J0KCksIDUpKQotCSAgICAJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLEludGVnZXIudG9TdHJpbmcoc3AuZ2V0UG9ydCgpKSxzcC5nZXROYW1lKCkpLG51bGwpKTsKLQkgICAgCX0KLSAgICAJfQotICAgIAlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJUSU5HKTsKLSAgICAJc2V0TW9kZShsYXVuY2hNb2RlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2FsbCB0byBzdGFydCBQaW5nIHRocmVhZCB0aGF0IHdpbGwgY2hlY2sgZm9yIHN0YXJ0dXAgb2YgdGhlIHNlcnZlci4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0UGluZ1RocmVhZCgpCi0gICAgewotICAgIAl0cnkgewotICAgIAkJU3RyaW5nIHVybCA9ICJodHRwOi8vIitnZXRTZXJ2ZXIoKS5nZXRIb3N0KCk7OyAvLyROT04tTkxTLTEkCi0gICAgCSAgCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFNlcnZlcigpLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgICAgICAJU2VydmVyUG9ydCBzcCA9IG51bGw7Ci0gICAgCSAgICBmb3IoaW50IGk9MDtpPHBvcnRzLmxlbmd0aDtpKyspewotICAgIAkgICAgCWlmKHBvcnRzW2ldLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cCIpKXsvLyROT04tTkxTLTEkCi0gICAgCSAgICAJCXNwPXBvcnRzW2ldOwotICAgIAkgICAgCX0KLSAgICAJICAgIH0KLQkgICAgCWlmKHNwPT1udWxsKXsKLQkgICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDYW4ndCBwaW5nIGZvciBzZXJ2ZXIgc3RhcnR1cC4iKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCXJldHVybjsKLQkgICAgCX0KLSAgICAgICAgCWludCBwb3J0ID0gc3AuZ2V0UG9ydCgpOwotICAgIAkJaWYgKHBvcnQgIT0gODApCi0gICAgCQkJdXJsICs9ICI6IiArIHBvcnQ7IC8vJE5PTi1OTFMtMSQKLSAgICAJCXBpbmcgPSBuZXcgUGluZ1RocmVhZChnZXRTZXJ2ZXIoKSwgdXJsLCB0aGlzKTsKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNhbid0IHBpbmcgZm9yIHNlcnZlciBzdGFydHVwLiIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0gIAkKLSAgICB9Ci0gICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm9jZXNzKGZpbmFsIElQcm9jZXNzIG5ld1Byb2Nlc3MpIHsKLSAgICAJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLSAgICAJCXJldHVybjsKLSAgICAJaWYocHJvY2Vzc0xpc3RlbmVyIT1udWxsKQotICAgIAkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotICAgIAlpZiAobmV3UHJvY2Vzcz09bnVsbCkKLSAgICAJCXJldHVybjsKLSAgICAJcHJvY2VzcyA9IG5ld1Byb2Nlc3M7Ci0gICAgCXByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJRGVidWdFdmVudFNldExpc3RlbmVyKCkgewotICAgIAkJcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotICAgIAkJCWlmIChldmVudHMgIT0gbnVsbCkgewotICAgIAkJCQlpbnQgc2l6ZSA9IGV2ZW50cy5sZW5ndGg7Ci0gICAgCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgCQkJCQlpZiAocHJvY2VzcyE9IG51bGwgJiYgIHByb2Nlc3MuZXF1YWxzKGV2ZW50c1tpXS5nZXRTb3VyY2UoKSkgJiYgZXZlbnRzW2ldLmdldEtpbmQoKSA9PSBEZWJ1Z0V2ZW50LlRFUk1JTkFURSkgewotICAgIAkJCQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgCQkJCQkJc3RvcEltcGwoKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfTsKLSAgICAJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHN0b3BJbXBsKCkgewotICAgIAlpZiAocGluZyAhPSBudWxsKSB7Ci0gICAgCQlwaW5nLnN0b3AoKTsKLSAgICAJCXBpbmcgPSBudWxsOwotICAgIAl9Ci0gICAgCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLSAgICAJCXByb2Nlc3MgPSBudWxsOwotICAgIAkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotICAgIAkJcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLSAgICAJfQotICAgIAlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJlZm9yZSBhIHByb2Nlc3MgY3JlYXRlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSAKLSAgICAgKiBsYXVuY2ggY29uZmlnLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLSAgICAJCXJldHVybjsKLSAgICAKLSAgICAJdHJ5IHsKLSAgICAJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOwotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiS2lsbGluZyB0aGUgU2VydmVyIHByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJaWYgKHByb2Nlc3MgIT0gbnVsbCAmJiAhcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSkgewotICAgIAkJCXByb2Nlc3MudGVybWluYXRlKCk7Ci0gICAgCQkJCi0gICAgCQl9Ci0gICAgCQlzdG9wSW1wbCgpOwotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Iga2lsbGluZyB0aGUgcHJvY2VzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZ2V0U3RvcENsYXNzcGF0aCgpIHsKLSAgICAJU3RyaW5nIGNwUmVmID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0b3AoKS5nZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLSAgICAJcmV0dXJuIHNlcnZlckNsYXNzcGF0aChjcFJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSU1vZHVsZVtdIG1vZHVsZXMgPSB0aGlzLmdldFNlcnZlcigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgYm9vbGVhbiBhbGxwdWJsaXNoZWQ9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJaWYodGhpcy5nZXRTZXJ2ZXIoKS5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobmV3IElNb2R1bGVbXXttb2R1bGVzW2ldfSkhPUlTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQotICAgICAgICAgICAgICAgIGFsbHB1Ymxpc2hlZD1mYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZihhbGxwdWJsaXNoZWQpCi0gICAgICAgICAgICBzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotICAgIH0KLSAgICAKLSAJcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLSAJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCk7Ci0gCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZmM0ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGdldCBtZXNzYWdlcwotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcyBleHRlbmRzIE5MU3sKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEU9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuY2VsTm9QdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZHVsZU5vdENvbXBhdGlibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1NlcnZlclR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb0NsYXNzcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdDbGFzc3BhdGhFbnRyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbW92ZU1vZHVsZUFudHB1Ymxpc2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hBbnRwdWJsaXNoZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tbWFuZGxpbmVVbnNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JraW5nZGlyVW5zcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JMYXVuY2hpbmdFeGVjdXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxTdG9wTGF1bmNoZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVidWdQb3J0VW5zcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydGluZ0V4dGVybmFsRGVidWdnaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bk1vZGVOb3RTdXBwb3J0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5hYmxlVG9DcmVhdGVQdWJsaXNoZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuTm90UHVibGlzaERlbGV0ZWRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW50TGF1bmNoZXJNaXNzaW5nOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaGluZ1RvRXh0ZXJuYWxHZW5lcmljU2VydmVyOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcmlmeWluZ0V4dGVybmFsU2VydmVyRGVidWdnaW5nTGF1bmNoQXR0cmlidXRlczsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbFNlcnZlckRlYnVnQ29ubmVjdG9yTm90U3BlY2lmaWVkOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0aW5nRXh0ZXJuYWxTZXJ2ZXJEZWJ1Z2dpbmdTb3VyY2VMb2NhdG9yOwotICAgIAotCQotCXN0YXRpY3sKLQkJICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKFJFU09VUkNFX0JVTkRMRSwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlNjg1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9ySlJFPUludmFsaWQgSlJFCi1lcnJvck5vU2VydmVyVHlwZT1ObyBzZXJ2ZXIgdHlwZSBkZWZpbml0aW9uCi1lcnJvck1pc3NpbmdDbGFzc3BhdGhFbnRyeT1NaXNzaW5nIGNsYXNzcGF0aCBlbnRyeSB7MH0KLWVycm9yUG9ydEluVXNlPVNlcnZlciBwb3J0IEluIFVzZSB7MH0tezF9Ci1jYW5jZWxOb1B1Ymxpc2g9Tm90aGluZyB0byBwdWJsaXNoCi1tb2R1bGVOb3RDb21wYXRpYmxlPU1vZHVsZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlCi1lcnJvck5vQ2xhc3NwYXRoPU5vIGNsYXNzcGF0aCBpcyBkZWZpbmVkCi1lcnJvclJlbW92ZU1vZHVsZUFudHB1Ymxpc2hlcj0gUmVtb3ZlIG1vZHVsZSBmYWlsZWQgdXNpbmcgQW50IHB1Ymxpc2hlcgotZXJyb3JQdWJsaXNoQW50cHVibGlzaGVyPSBQdWJsaXNoIGZhaWxlZCB1c2luZyBBbnQgcHVibGlzaGVyCi1jb21tYW5kbGluZVVuc3BlY2lmaWVkPUV4ZWN1dGFibGUgY29tbWFuZGxpbmUgaXMgdW5zcGVjaWZpZWQKLXdvcmtpbmdkaXJVbnNwZWNpZmllZD1Xb3JraW5nIGRpcmVjdG9yeSBpcyB1bnNwZWNpZmllZCBvciBpbnZhbGlkCi1lcnJvckxhdW5jaGluZ0V4ZWN1dGFibGU9RXJyb3IgbGF1bmNoaW5nIGV4ZWN1dGFibGUKLW1pc3NpbmdTZXJ2ZXI9U2VydmVyIGRvZXMgbm90IGV4aXN0Ci1leHRlcm5hbFN0b3BMYXVuY2hlcj1FeHRlcm5hbExhdW5jaFN0b3BwZXIKLWRlYnVnUG9ydFVuc3BlY2lmaWVkPURlYnVnZ2luZyBwb3J0IGlzIHVuc3BlY2lmaWVkCi1lcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmc9RXJyb3IgbGF1bmNoaW5nIHJlbW90ZSBkZWJ1Z2dpbmcgZm9yIGV4dGVybmFsIHNlcnZlciwgY2hhbmdpbmcgdG8gbm9uLWRlYnVnZ2luZyBtb2RlLlxuUGxlYXNlIGNoZWNrIHRoZSBkZWJ1ZyBwb3J0IHNldHRpbmcgYW5kIGVuc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgJ3N0YXJ0JyBleGVjdXRhYmxlIGxhdW5jaGVzIHRoZSBzZXJ2ZXIgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZAotaW52YWxpZFBhdGggPSB7MH0gaXMgbm90IHZhbGlkCi1ydW5Nb2RlTm90U3VwcG9ydGVkPSBTZWxlY3RlZCBWTSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbW9kZQotdW5hYmxlVG9DcmVhdGVQdWJsaXNoZXI9VW5hYmxlIHRvIGNyZWF0ZSBwdWJsaXNoZXIgezB9Ci1jYW5Ob3RQdWJsaXNoRGVsZXRlZE1vZHVsZT1DYW4gbm90IHB1Ymxpc2ggYmVjYXVzZSBtb2R1bGUgezB9IGlzIGNsb3NlZCBvciBkZWxldGVkCi1hbnRMYXVuY2hlck1pc3Npbmc9QW50IGxhdW5jaGVyIGlzIG1pc3Npbmcgb3IgZGlzYWJsZWQKLWF0dGFjaGluZ1RvRXh0ZXJuYWxHZW5lcmljU2VydmVyPUF0dGFjaGluZyB0byBleHRlcm5hbCBnZW5lcmljIHNlcnZlciB7MH0uCi12ZXJpZnlpbmdFeHRlcm5hbFNlcnZlckRlYnVnZ2luZ0xhdW5jaEF0dHJpYnV0ZXM9VmVyaWZ5aW5nIGRlYnVnZ2luZyBsYXVuY2ggYXR0cmlidXRlcy4KLWV4dGVybmFsU2VydmVyRGVidWdDb25uZWN0b3JOb3RTcGVjaWZpZWQ9RGVidWdnaW5nIGNvbm5lY3RvciBub3Qgc3BlY2lmaWVkLgotY3JlYXRpbmdFeHRlcm5hbFNlcnZlckRlYnVnZ2luZ1NvdXJjZUxvY2F0b3I9Q3JlYXRpbmcgZGVidWdnaW5nIHNvdXJjZSBsb2NhdG9yLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNmMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuRXhlY3V0aW9uQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNUnVubmVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyaWMgc2VydmVyLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsCi0JCQlJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQlhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLm1pc3NpbmdTZXJ2ZXIsIG51bGwsCi0JCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwotCQl9Ci0JCQotLy8JCUNvbW1lbnRlZCB1bnRpbCBidWcgMjEwODU5IGlzIHJlc29sdmVkCi0vLwkJaWYgKHNlcnZlci5zaG91bGRQdWJsaXNoKCkgJiYgU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkpCi0vLwkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0JCQotCQlHZW5lcmljU2VydmVyQmVoYXZpb3VyIGdlbmVyaWNTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQotCQl0cnkgewotCQkJZ2VuZXJpY1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkJaWYoZ2VuZXJpY1NlcnZlci5nZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNSZW1vdGVIb3N0cygpICYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0SG9zdCgpKSl7Ci0JCQkvLyBubyBsYXVuY2ggZm9yIHJlbW90ZSBzZXJ2ZXJzCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWFpblR5cGVOYW1lID0gZ2VuZXJpY1NlcnZlci5nZXRTdGFydENsYXNzTmFtZSgpOwotCQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJCQotCQkJaWYocnVubmVyID09IG51bGwgJiYgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSl7Ci0JCQkJcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkJfQotCQkJaWYocnVubmVyID09IG51bGwpewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwwLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucnVuTW9kZU5vdFN1cHBvcnRlZCxudWxsKSk7Ci0JCQl9Ci0JCQlGaWxlIHdvcmtpbmdEaXIgPSB2ZXJpZnlXb3JraW5nRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJCWlmICh3b3JraW5nRGlyICE9IG51bGwpCi0JCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkvLyBQcm9ncmFtICYgVk0gYXJncwotCQkJU3RyaW5nIHBnbUFyZ3MgPSBnZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQkJU3RyaW5nW10gZW52cCA9IGdldEVudmlyb25tZW50KGNvbmZpZ3VyYXRpb24pOwotCQkJCi0JCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0KLQkJCS8vIFZNLXNwZWNpZmljIGF0dHJpYnV0ZXMKLQkJCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQotCQkJLy8gQ2xhc3NwYXRoCi0JCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0KLQkJCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJCVZNUnVubmVyQ29uZmlndXJhdGlvbiBydW5Db25maWcgPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKAotCQkJCQltYWluVHlwZU5hbWUsIGNsYXNzcGF0aCk7Ci0JCQlydW5Db25maWcuc2V0UHJvZ3JhbUFyZ3VtZW50cyhleGVjQXJncy5nZXRQcm9ncmFtQXJndW1lbnRzQXJyYXkoKSk7Ci0JCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJCXJ1bkNvbmZpZy5zZXRXb3JraW5nRGlyZWN0b3J5KHdvcmtpbmdEaXJOYW1lKTsKLQkJCXJ1bkNvbmZpZy5zZXRFbnZpcm9ubWVudChlbnZwKTsKLQkJCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCQkJCi0JCQkvLyBCb290cGF0aAotCQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJCWlmIChib290cGF0aCAhPSBudWxsICYmIGJvb3RwYXRoLmxlbmd0aCA+IDApCi0JCQkJcnVuQ29uZmlnLnNldEJvb3RDbGFzc1BhdGgoYm9vdHBhdGgpOwotCQkJCi0JCQlzZXREZWZhdWx0U291cmNlTG9jYXRvcihsYXVuY2gsIGNvbmZpZ3VyYXRpb24pOwotCQkJCi0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkgewotCQkJCXRyeSB7Ci0JCQkJCVNlcnZlclByb2ZpbGVyRGVsZWdhdGUuY29uZmlndXJlUHJvZmlsaW5nKGxhdW5jaCwgdm0sIHJ1bkNvbmZpZywgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlnZW5lcmljU2VydmVyLnN0b3BJbXBsKCk7Ci0JCQkJCXRocm93IGNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gTGF1bmNoIHRoZSBjb25maWd1cmF0aW9uCi0JCQlnZW5lcmljU2VydmVyLnN0YXJ0UGluZ1RocmVhZCgpOwotCQkJcnVubmVyLnJ1bihydW5Db25maWcsIGxhdW5jaCwgbW9uaXRvcik7Ci0JCQlnZW5lcmljU2VydmVyLnNldFByb2Nlc3MobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsImVycm9yIGxhdW5jaGluZyBnZW5lcmljIHNlcnZlciIsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyaWNTZXJ2ZXIudGVybWluYXRlKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGEgY29yZSBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgb3B0aW9uYWwKLQkgKiBleGNlcHRpb24uIFRoZSBleGNlcHRpb24ncyBzdGF0dXMgY29kZSB3aWxsIGluZGljYXRlIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGNhdXNlIG9mIHRoZSBlcnJvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgdW5kZXJseWluZwotCSAqICBleGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhYm9ydChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbiwgaW50IGNvZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgY29kZSwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmVlY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLkh0dHBMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5FSkJCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5KbmRpTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSm5kaU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0vKioKLSAqIExhdW5jaGFibGUgYWRhcHRlciBkZWxlZ2F0ZSBmb3IgZ2VuZXJpYyBzZXJ2ZXJzLgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX05BTUlOR19QUk9WSURFUl9VUkxfUFJPUEtFWSA9ICJqYXZhLm5hbWluZy5wcm92aWRlci51cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTkFNSU5HX0ZBQ1RPUllfSU5JVElBTF9QUk9QS0VZID0gImphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogQHNlZSBJTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSNnZXRMYXVuY2hhYmxlKElTZXJ2ZXIsIElNb2R1bGVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0KSB7Ci0JCVNlcnZlckRlbGVnYXRlIGRlbGVnYXRlID0gKFNlcnZlckRlbGVnYXRlKXNlcnZlci5sb2FkQWRhcHRlcihTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcyxudWxsKTsKLQkJaWYgKCEoZGVsZWdhdGUgaW5zdGFuY2VvZiBHZW5lcmljU2VydmVyKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpIHx8KG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSkKLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlSHR0cExhdW5jaGFibGUobW9kdWxlT2JqZWN0LCBkZWxlZ2F0ZSk7Ci0JCQotICAgICAgICBpZigobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgRUpCQmVhbikgfHwgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIEpuZGlPYmplY3QpKQotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVKbmRpTGF1bmNoYWJsZShtb2R1bGVPYmplY3QsZGVsZWdhdGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBwcmVwYXJlSm5kaUxhdW5jaGFibGUoSU1vZHVsZUFydGlmYWN0IG1vZHVsZU9iamVjdCwgU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUpIHsKLSAgICAgICAgSm5kaUxhdW5jaGFibGUgbGF1bmNoYWJsZSA9IG51bGw7Ci0gICAgICAgIEdlbmVyaWNTZXJ2ZXIgZ2VuZXJpY1NlcnZlciA9IChHZW5lcmljU2VydmVyKWRlbGVnYXRlOwotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZW5lcmljU2VydmVyLmdldFNlcnZlckRlZmluaXRpb24oKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dChKQVZBX05BTUlOR19GQUNUT1JZX0lOSVRJQUxfUFJPUEtFWSxkZWZpbml0aW9uLmdldEpuZGlDb25uZWN0aW9uKCkuZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkpOwotICAgICAgICBwcm9wcy5wdXQoSkFWQV9OQU1JTkdfUFJPVklERVJfVVJMX1BST1BLRVksZGVmaW5pdGlvbi5nZXRKbmRpQ29ubmVjdGlvbigpLmdldFByb3ZpZGVyVXJsKCkpOwotICAgICAgICBMaXN0IGpwcyA9IGRlZmluaXRpb24uZ2V0Sm5kaUNvbm5lY3Rpb24oKS5nZXRKbmRpUHJvcGVydHkoKTsKLSAgICAgICAgSXRlcmF0b3IgcHJvcHNJdCA9anBzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKHByb3BzSXQuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgIEFyZ3VtZW50UGFpciBwcm9wID0gKEFyZ3VtZW50UGFpcilwcm9wc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIHByb3BzLnB1dChwcm9wLmdldE5hbWUoKSxwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBFSkJCZWFuKQotICAgICAgICB7Ci0gICAgICAgICAgICBFSkJCZWFuIGJlYW4gPSAoRUpCQmVhbiltb2R1bGVPYmplY3Q7Ci0gICAgICAgICAgICBsYXVuY2hhYmxlID0gbmV3IEpuZGlMYXVuY2hhYmxlKHByb3BzLGJlYW4uZ2V0Sm5kaU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgSm5kaU9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgICAgSm5kaU9iamVjdCBqbmRpID0gKEpuZGlPYmplY3QpbW9kdWxlT2JqZWN0OwotICAgICAgICAgICAgbGF1bmNoYWJsZSA9IG5ldyBKbmRpTGF1bmNoYWJsZShwcm9wcyxqbmRpLmdldEpuZGlOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYXVuY2hhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2R1bGVPYmplY3QKLSAgICAgKiBAcGFyYW0gZGVsZWdhdGUKLSAgICAgKiBAcmV0dXJuIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IHByZXBhcmVIdHRwTGF1bmNoYWJsZShJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0LCBTZXJ2ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotICAgICAgICB0cnkgewotCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBkZWxlZ2F0ZSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGVPYmplY3QuZ2V0TW9kdWxlKCkpOwotCQkJCi0JCQlUcmFjZS50cmFjZSgicm9vdDogIiArIHVybCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpIHsKLQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgbW9kdWxlT2JqZWN0OwotCQkJCWlmIChzZXJ2bGV0LmdldEFsaWFzKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IHNlcnZsZXQuZ2V0QWxpYXMoKTsKLQkJCQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCQl9IGVsc2UKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsICJzZXJ2bGV0LyIgKyBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpIHsKLQkJCQlXZWJSZXNvdXJjZSByZXNvdXJjZSA9IChXZWJSZXNvdXJjZSkgbW9kdWxlT2JqZWN0OwotCQkJCVN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJVHJhY2UudHJhY2UoInBhdGg6ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5sZW5ndGgoKSA+IDApIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCX0gCi0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZSgiRXJyb3IgZ2V0dGluZyBVUkwgZm9yICIgKyBtb2R1bGVPYmplY3QsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2UyZDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiBHZW5lcmljIHNlcnZlciBydW50aW1lIHN1cHBvcnQuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSUphdmFSdW50aW1lCi17Ci0JLyoqCi0JICogU2VydmVyIGRlZmluaXRpb24gYXR0cmlidXRlIGlkIGluIHRoZSBzZXJ2ZXIgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9ERUZJTklUSU9OX0lEID0gInNlcnZlcl9kZWZpbml0aW9uX2lkIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFNlcnZlciBpbnN0YW5jZSBwcm9wZXJ0aWVzIGF0dHJpYnV0ZSBpZCBvbiBzZXJ2ZXIgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTID0gImdlbmVyaWNfc2VydmVyX2luc3RhbmNlX3Byb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCA9ICJ2bS1pbnN0YWxsLXR5cGUtaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9JRCA9ICJ2bS1pbnN0YWxsLWlkIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2bSB0eXBlIGlkCi0JICogQHJldHVybiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBJcyB1c2UgZGVmYXVsdCBWTSBzZWxlY3RlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgVk0gaWQKLQkgKiBAcmV0dXJuIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklHZW5lcmljUnVudGltZSNnZXRWTUluc3RhbGwoKQotCSAqLwotCXB1YmxpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbCgpIHsKLQkJaWYgKGdldFZNSW5zdGFsbFR5cGVJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQl0cnkgewotCQkJSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkpOwotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKTsKLQkJCWludCBzaXplID0gdm1JbnN0YWxscy5sZW5ndGg7Ci0JCQlTdHJpbmcgaWQgPSBnZXRWTUluc3RhbGxJZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaWQuZXF1YWxzKHZtSW5zdGFsbHNbaV0uZ2V0SWQoKSkpCi0JCQkJCXJldHVybiB2bUluc3RhbGxzW2ldOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklHZW5lcmljUnVudGltZSN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGwoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvckpSRSwgbnVsbCk7Ci0JCX0KLQkJU2VydmVyUnVudGltZSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmKHNlcnZlclR5cGVEZWZpbml0aW9uID09IG51bGwpIHsKLQkJICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXJUeXBlLCBudWxsKTsKLSAgICAgICAgfQotCQlpZihzZXJ2ZXJUeXBlRGVmaW5pdGlvbi5nZXRDbGFzc3BhdGgoKT09IG51bGwgfHwgc2VydmVyVHlwZURlZmluaXRpb24uZ2V0Q2xhc3NwYXRoKCkuc2l6ZSgpPDEpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwICxHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTm9DbGFzc3BhdGgsbnVsbCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlQ2xhc3NwYXRocyhzZXJ2ZXJUeXBlRGVmaW5pdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFsbCBkZWZpbmVkIGNsYXNzcGF0aHMuCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhzKFNlcnZlclJ1bnRpbWUgc2VydmVyVHlwZURlZmluaXRpb24pIHsKLQkJSXRlcmF0b3IgY3BMaXN0ICA9IHNlcnZlclR5cGVEZWZpbml0aW9uLmdldENsYXNzcGF0aCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChjcExpc3QuaGFzTmV4dCgpKSB7Ci0JCQlDbGFzc3BhdGggY3B0aCA9IChDbGFzc3BhdGgpIGNwTGlzdC5uZXh0KCk7Ci0JICAgICAgICBpZihjcHRoLmdldEFyY2hpdmUoKT09IG51bGwgfHwgY3B0aC5nZXRBcmNoaXZlKCkuc2l6ZSgpPDEpCi0JICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAgLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JOb0NsYXNzcGF0aCxudWxsKTsKLQkJCUl0ZXJhdG9yIGFyY2hJdGVyID0gY3B0aC5nZXRBcmNoaXZlKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChhcmNoSXRlci5oYXNOZXh0KCkpIHsKLQkJCQlBcmNoaXZlVHlwZSBhcmNoID0gKEFyY2hpdmVUeXBlKSBhcmNoSXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGFyY1BhdGggPSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbi5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGFyY2guZ2V0UGF0aCgpKTsKLQkJICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhcmNQYXRoKTsKLQkJICAgICAgICAgICAgaWYoZi5leGlzdHMoKT09ZmFsc2UpCi0JCSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCAsTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvck1pc3NpbmdDbGFzc3BhdGhFbnRyeSxmLmdldFBhdGgoKSksbnVsbCk7CQotCQkJfQotCQl9Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2VydmVyVHlwZURlZmluaXRpb24gZm9yIHRoaXMgcnVudGltZS4gCi0JICogUG9wdWxhdGVkIHdpdGggdGhlIHVzZXIgcHJvcGVydGllcyBpZiBleGlzdHMuIAotCSAqIAotCSAqIEByZXR1cm4gcG9wdWxhdGVkIFNlcnZlclR5cGVEZWZpbml0aW9uCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKQotCXsKLQkgICBTdHJpbmcgaWQ9ICBnZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCSAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0QXR0cmlidXRlKFNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLChNYXApbnVsbCk7Ci0JICAgaWYoaWQ9PW51bGwpCi0JICAgICAgIHJldHVybiBudWxsOwotCSAgIHJldHVybiBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihpZCxwcm9wZXJ0aWVzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0Vk0gdG8gYmUgdXNlZAotCSAqIEBwYXJhbSB2bUluc3RhbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpIHsKLQkJaWYgKHZtSW5zdGFsbCA9PSBudWxsKSB7Ci0JCQlzZXRWTUluc3RhbGwobnVsbCwgbnVsbCk7Ci0JCX0gZWxzZQotCQkJc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSwgdm1JbnN0YWxsLmdldElkKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Vk1JbnN0YWxsKFN0cmluZyB0eXBlSWQsIFN0cmluZyBpZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgdHlwZUlkKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgaWQpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gaW5zdGFuY2UgcHJvZXJ0aWVzCi0JICogQHJldHVybiBwcm9wZXJ0eSBtYXAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgc2VydmVyZGVmIGlkCi0JICogQHJldHVybiBzZXJ2ZXJkZWYgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVJWRVJfREVGSU5JVElPTl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIHNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzCi0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhNYXAgbWFwKSB7Ci0JCXNldEF0dHJpYnV0ZShTRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywgbWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHNlcnZlcmRlZiBpZAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRGVmaW5pdGlvbklkKFN0cmluZyBzKSB7Ci0JCXNldEF0dHJpYnV0ZShTRVJWRVJfREVGSU5JVElPTl9JRCwgcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IHByb3BzID0gdGhpcy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7Ci0gCQlNYXAgaW5zdGFuY2VQcm9wc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb3BlcnR5IGVsZW1lbnQgPSAoUHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJaWYoUHJvcGVydHkuQ09OVEVYVF9SVU5USU1FLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRDb250ZXh0KCkpKQotCQkJCWluc3RhbmNlUHJvcHNNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudC5nZXREZWZhdWx0KCkpOwotCQl9Ci0gCQlzZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoaW5zdGFuY2VQcm9wc01hcCk7Ci0KLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGExZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0vKioKLSAqIFByb3ZpZGVzIHRoZSBDbGFzc3BhdGggY29udGFpbmVycyB0byBiZSBhZGRlZCBpbnRvIHByb2plY3QgY2xhc3NwYXRocy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIjcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lLFN0cmluZyBpZCl7CQkKLQkJcmV0dXJuIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIocnVudGltZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIjcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lKXsJCQotCQlyZXR1cm4gU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmdldFNlcnZlckNsYXNzUGF0aEVudHJ5KHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgc2VydmVyZGVmLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIGNsYXNzcGF0aEVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0RGVsZWdhdGVDbGFzc3BhdGhFbnRyaWVzKElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlHZW5lcmljU2VydmVyUnVudGltZSBnZW5lcmljUnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSlydW50aW1lLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLCBtb25pdG9yKTsKLQkJaWYgKGdlbmVyaWNSdW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBnZW5lcmljUnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJaWYgKHZtSW5zdGFsbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHZtSW5zdGFsbC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZUlkID0gdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpOwotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpLmFwcGVuZCh0eXBlSWQpLmFwcGVuZChuYW1lKSkgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkZDZmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Gb2xkZXJTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBTb3VyY2VQYXRoQ29tcHV0ZXIgZm9yIHRoZSBHZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSAgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlI2NvbXB1dGVTb3VyY2VDb250YWluZXJzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gdW5yZXNvbHZlZEVudHJpZXMgPSBKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFNvdXJjZUxvb2t1cFBhdGgoY29uZmlndXJhdGlvbik7Ci0JCUxpc3Qgc291cmNlZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gIFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7Ci0JCQotCQlMaXN0IGphdmFQcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXByb2Nlc3NNb2R1bGVzKHNvdXJjZWZvbGRlckxpc3QsIG1vZHVsZXMsIGphdmFQcm9qZWN0TGlzdCwgc2VydmVyLG1vbml0b3IpOwotCi0KLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHByb2plY3RFbnRyaWVzID0gbmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbamF2YVByb2plY3RMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb2plY3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0RW50cmllc1tpXSA9IEphdmFSdW50aW1lLm5ld1Byb2plY3RSdW50aW1lQ2xhc3NwYXRoRW50cnkoKElKYXZhUHJvamVjdClqYXZhUHJvamVjdExpc3QuZ2V0KGkpKTsgCi0JCX0KLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAgbmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbcHJvamVjdEVudHJpZXMubGVuZ3RoK3VucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aF07IAotCQlTeXN0ZW0uYXJyYXljb3B5KHVucmVzb2x2ZWRFbnRyaWVzLDAsZW50cmllcywwLHVucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEVudHJpZXMsMCxlbnRyaWVzLHVucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aCxwcm9qZWN0RW50cmllcy5sZW5ndGgpOwotCQkKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkID0gSmF2YVJ1bnRpbWUucmVzb2x2ZVNvdXJjZUxvb2t1cFBhdGgoZW50cmllcywgY29uZmlndXJhdGlvbik7Ci0JCUlTb3VyY2VDb250YWluZXJbXSBqYXZhU291cmNlQ29udGFpbmVycyA9IEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwotCQkKLQkJaWYgKCFzb3VyY2Vmb2xkZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbWJpbmVkU291cmNlQ29udGFpbmVycyA9IG5ldyBJU291cmNlQ29udGFpbmVyW2phdmFTb3VyY2VDb250YWluZXJzLmxlbmd0aCArIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpXTsKLQkJCXNvdXJjZWZvbGRlckxpc3QudG9BcnJheShjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMpOwotCQkJU3lzdGVtLmFycmF5Y29weShqYXZhU291cmNlQ29udGFpbmVycywgMCwgY29tYmluZWRTb3VyY2VDb250YWluZXJzLCBzb3VyY2Vmb2xkZXJMaXN0LnNpemUoKSwgamF2YVNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoKTsKLQkJCWphdmFTb3VyY2VDb250YWluZXJzID0gY29tYmluZWRTb3VyY2VDb250YWluZXJzOwotCQl9Ci0JCQotCQlyZXR1cm4gamF2YVNvdXJjZUNvbnRhaW5lcnM7Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTW9kdWxlcyhMaXN0IHNvdXJjZWZvbGRlckxpc3QsIElNb2R1bGVbXSBtb2R1bGVzLCBMaXN0IGphdmFQcm9qZWN0TGlzdCwgSVNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGVzW2ldLmdldFByb2plY3QoKTsKLQkJCUlNb2R1bGVbXSBwTW9kdWxlID0gbmV3IElNb2R1bGVbMV07Ci0JCQlwTW9kdWxlWzBdPW1vZHVsZXNbaV07Ci0JCQlJTW9kdWxlW10gY01vZHVsZSA9IHNlcnZlci5nZXRDaGlsZE1vZHVsZXMocE1vZHVsZSwgbW9uaXRvcik7Ci0JCQlpZihjTW9kdWxlICE9IG51bGwgJiYgY01vZHVsZS5sZW5ndGg+MCkKLQkJCXsKLQkJCQlwcm9jZXNzTW9kdWxlcyhzb3VyY2Vmb2xkZXJMaXN0LCBjTW9kdWxlLCBqYXZhUHJvamVjdExpc3QsIHNlcnZlciwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUZvbGRlciBtb2R1bGVGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihtb2R1bGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJaWYgKG1vZHVsZUZvbGRlci5leGlzdHMoKSkgewotCQkJCQlzb3VyY2Vmb2xkZXJMaXN0LmFkZChuZXcgRm9sZGVyU291cmNlQ29udGFpbmVyKG1vZHVsZUZvbGRlciwgdHJ1ZSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQkJCQkJaWYoIWphdmFQcm9qZWN0TGlzdC5jb250YWlucyhqYXZhUHJvamVjdCkpewotCQkJCQkJCQlqYXZhUHJvamVjdExpc3QuYWRkKGphdmFQcm9qZWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5ZGJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLQotLyoqCi0gKiBUaHJlYWQgdXNlZCB0byBwaW5nIHNlcnZlciB0byB0ZXN0IHdoZW4gaXQgaXMgc3RhcnRlZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGluZ1RocmVhZCB7Ci0JLy8gZGVsYXkgYmVmb3JlIHBpbmdpbmcgc3RhcnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfREVMQVkgPSAyMDAwOwotCi0JLy8gZGVsYXkgYmV0d2VlbiBwaW5ncwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0lOVEVSVkFMID0gMjUwOwotCi0JLy8gbWF4aW11bSBudW1iZXIgb2YgcGluZ3MgYmVmb3JlIGdpdmluZyB1cAotCXByaXZhdGUgaW50IG1heFBpbmdzID0gNTY7IC8vIHRvdGFsOiAxNiBzZWNvbmRzICsgY29ubmVjdGlvbiB0aW1lCi0KLQlwcml2YXRlIGJvb2xlYW4gc3RvcDsKLQlwcml2YXRlIFN0cmluZyBmVXJsOwotCXByaXZhdGUgSVNlcnZlciBmU2VydmVyOwotCXByaXZhdGUgR2VuZXJpY1NlcnZlckJlaGF2aW91ciBmR2VuZXJpY1NlcnZlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGdlbmVyaWNTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgUGluZ1RocmVhZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIHVybCwgR2VuZXJpY1NlcnZlckJlaGF2aW91ciBnZW5lcmljU2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZlNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5mVXJsID0gdXJsOwotCQl0aGlzLm1heFBpbmdzID0gZ3Vlc3NNYXhQaW5ncyhnZW5lcmljU2VydmVyKTsKLQkJdGhpcy5mR2VuZXJpY1NlcnZlciA9IGdlbmVyaWNTZXJ2ZXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnN0YXJ0KCk7Ci0JfQotICAgIAotCXByaXZhdGUgaW50IGd1ZXNzTWF4UGluZ3MoR2VuZXJpY1NlcnZlckJlaGF2aW91ciBzZXJ2ZXIpCi0gICAgewotICAgIAlpbnQgbWF4cGluZ3M9LTE7Ci0gICAgCWludCBzdGFydFRpbWVvdXQgPSAoKFNlcnZlcilzZXJ2ZXIuZ2V0U2VydmVyKCkpLmdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKLSAgICAJaWYoc3RhcnRUaW1lb3V0PjApCi0gICAgCQltYXhwaW5ncz1zdGFydFRpbWVvdXQvUElOR19JTlRFUlZBTDsKLSAgICAJcmV0dXJuIG1heHBpbmdzOwotICAgIH0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZW1vdGUoKXsKLQkJcmV0dXJuIChmU2VydmVyLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkmJiAhU29ja2V0VXRpbC5pc0xvY2FsaG9zdChmU2VydmVyLmdldEhvc3QoKSkgKTsKLQl9Ci0JLyoqCi0JICogUGluZyB0aGUgc2VydmVyIHVudGlsIGl0IGlzIHN0YXJ0ZWQuIFRoZW4gc2V0IHRoZSBzZXJ2ZXIKLQkgKiBzdGF0ZSB0byBTVEFURV9TVEFSVEVELgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBpbmcoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoUElOR19ERUxBWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQl3aGlsZSAoIXN0b3ApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvdW50ID09IG1heFBpbmdzICYmICFpc1JlbW90ZSgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmU2VydmVyLnN0b3AoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogY291bGQgbm90IHN0b3Agc2VydmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzdG9wID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKCFpc1JlbW90ZSgpKQotCQkJCQljb3VudCsrOwotCQkJCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHBpbmdpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCVVSTCBwaW5nVXJsID0gbmV3IFVSTChmVXJsKTsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm4gPSBwaW5nVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJKChIdHRwVVJMQ29ubmVjdGlvbiljb25uKS5nZXRSZXNwb25zZUNvZGUoKTsKLQkKLQkJCQkvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAotCQkJCWlmICghc3RvcCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBzdWNjZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJCWZHZW5lcmljU2VydmVyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJaWYoIWlzUmVtb3RlKCkpCi0JCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQlmR2VuZXJpY1NlcnZlci5zZXRTZXJ2ZXJTdGFydGVkKCk7Ci0JCQkJaWYoIWlzUmVtb3RlKCkpCi0JCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBmYWlsZWQ6ICIrIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUHVibGlzaE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1B1Ymxpc2hNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjcyZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwotCi0vKioKLSAqIFV0aWxpdHkgZm9yIG1hbmFnaW5nIGdlbmVyaWMgcHVibGlzaGVycy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE1hbmFnZXIgCi17Ci0gICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnZW5lcmljIHB1Ymxpc2hlciBmb3IgZ2l2ZW4gSUQKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcmV0dXJuIHB1Ymxpc2hlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR2VuZXJpY1B1Ymxpc2hlciBnZXRQdWJsaXNoZXIoU3RyaW5nIGlkKSAKLSAgICB7Ci0gICAgICAgIElFeHRlbnNpb25bXSBleHRlbnNpb25zID0gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldEdlbmVyaWNQdWJsaXNoZXJFeHRlbnNpb24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3MgPSBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKGV4dGVuc2lvbnNbaV0pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29uZmlncy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZihjb25maWdzW2pdLmdldEF0dHJpYnV0ZSgiaWQiKS5lcXVhbHMoaWQpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR2VuZXJpY1B1Ymxpc2hlciljb25maWdzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Y2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIC8vaWdub3JlZAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiMDhlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5FeHRlbnNpb25Qb2ludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5TZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotLyoqCi0gKiBNYW5hZ2VzIHRoZSByZXRyaWVhdmFsIG9mIFNlcnZlclR5cGVEZWZpbml0aW9ucy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyIAotewotCXByaXZhdGUgWE1MVXRpbHMgZlhtbFV0aWxzOwotCQotCS8qKgotCSAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHNlcnZlcmRlZmluaXRpb24gYW5kIHJ1bnRpbWVkZWZpbml0aW9uIGV4dGVuc2lvbnMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RyeUNoYW5nZWQoSVJlZ2lzdHJ5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIElFeHRlbnNpb25EZWx0YVtdIGRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRXh0ZW5zaW9uUG9pbnRVdGlsLlNFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEKTsKLSAgICAgICAgICAgIGlmIChkZWx0YXMgIT0gbnVsbCAmJiBkZWx0YXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGhhbmRsZURlZmluaXRpb25zQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKENvcmVQbHVnaW4uUExVR0lOX0lELCBFeHRlbnNpb25Qb2ludFV0aWwuUlVOVElNRURFRklOSVRJT05fRVhURU5TSU9OX0lEKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGFzICE9IG51bGwgJiYgZGVsdGFzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVmaW5pdGlvbnNDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCQotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoVVJMIHNlcnZlckRlZmluaXRpb25VUkwpewotCQlzdXBlcigpOwotCQlmWG1sVXRpbHMgPSBuZXcgWE1MVXRpbHMoKTsKLQkJRXh0ZW5zaW9uUG9pbnRVdGlsLmFkZFJlZ2lzdHJ5TGlzdGVuZXIobmV3IFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIoKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBlaXRoZXI6IAotICAgICAqIAotICAgICAqIDEuIHRoZSBTZXJ2ZXJSdW50aW1lIHRoYXQgcmVwcmVzZW50cyB0aGUgLnNlcnZlcmRlZiBmaWxlIGZvciBhIGdpdmVuIAotICAgICAqICAgIHJ1bnRpbWUgdHlwZSwgYmFzZWQgb24gdGhlIHJ1bnRpbWVUeXBlSWQuCi0gICAgICogICAgCi0gICAgICogMi4gdGhlIFNlcnZlclJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIGJvdGggdGhlIC5zZXJ2ZXJkZWYgZmlsZSBmb3IgYQotICAgICAqICAgIGdpdmVuIHNlcnZlciB0eXBlLCBiYXNlZCBvbiB0aGUgc2VydmVyVHlwZUlkLCBjb21iaW5lZCB3aXRoIHRoZSAKLSAgICAgKiAgICAucnVudGltZWRlZiBmaWxlIGZvciB0aGUgcnVudGltZSB0eXBlLCBiYXNlZCBvbiB0aGUgcnVudGltZVR5cGVJZC4gICAKLSAgICAgKiAKLSAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yICgxKSBmaXJzdCwgaWYgdGhhdCBjb21iaW5hdGlvbiBpcyBub3QKLSAgICAgKiBmb3VuZCwgdGhlbiAoMikgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZlclR5cGVJZCBzZXJ2ZXIgdHlwZSBpZAotICAgICAqIEBwYXJhbSBydW50aW1lVHlwZUlkIHJ1bnRpbWUgdHlwZSBpZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHVzZXIgcHJvdmlkZWQgcHJvcGVydGllcwotICAgICAqIEByZXR1cm4gc2VydmVyIHJ1bnRpbWUgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIHVzZXIgcHJvcGVydGllcyAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihTdHJpbmcgc2VydmVyVHlwZUlkLCBTdHJpbmcgcnVudGltZVR5cGVJZCwgTWFwIHByb3BlcnRpZXMpIHsKLSAgICAgICAgCi0gICAgICAgIFNlcnZlclJ1bnRpbWUgc2VydmVyZGVmID0gZlhtbFV0aWxzLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHNlcnZlclR5cGVJZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VydmVyZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNlcnZlclJ1bnRpbWUgcnVudGltZWRlZiA9IGZYbWxVdGlscy5nZXRSdW50aW1lVHlwZURlZmluaXRpb24ocnVudGltZVR5cGVJZCk7Ci0gICAgICAgICAgICBpZiAocnVudGltZWRlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAJLy8gRmFsbCBiYWNrIHRvIHNpbmdsZSAuc2VydmVyZGVmCi0gICAgICAgICAgICAgICAgc2VydmVyZGVmID0gZlhtbFV0aWxzLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHJ1bnRpbWVUeXBlSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyZGVmID0gU2VydmVyUnVudGltZU1lcmdlVXRpbC5jb21iaW5lKHNlcnZlcmRlZiwgcnVudGltZWRlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHNpbmdsZSBzZXJ2ZXJkZWYKLSAgICAgICAgICAgIHNlcnZlcmRlZiA9IGZYbWxVdGlscy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihydW50aW1lVHlwZUlkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHNlcnZlcmRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2ZXJkZWYuc2V0UHJvcGVydHlWYWx1ZXMocHJvcGVydGllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzZXJ2ZXJkZWY7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNlcnZlclJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIHRoZSAuc2VydmVyZGVmIGZpbGUKLSAgICAgKiBmb3IgYSBnaXZlbiBydW50aW1lIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgcnVudGltZSB0eXBlIGlkCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdXNlciBwcm92aWRlZCBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiBzZXJ2ZXIgcnVudGltZSB0aGF0IGlzIGluaXRpYWxpemVkIHdpdGggdXNlciBwcm9wZXJ0aWVzIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclJ1bnRpbWVEZWZpbml0aW9uKFN0cmluZyBydW50aW1lVHlwZUlkLCBNYXAgcHJvcGVydGllcykgewotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBmWG1sVXRpbHMuZ2V0UnVudGltZVR5cGVEZWZpbml0aW9uKHJ1bnRpbWVUeXBlSWQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCB1c2FnZQotICAgICAgICAgICAgZGVmaW5pdGlvbiA9IGZYbWxVdGlscy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihydW50aW1lVHlwZUlkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXRQcm9wZXJ0eVZhbHVlcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlZmluaXRpb247Ci0gICAgfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBTZXJ2ZXJSdW50aW1lcyByZWdpc3RlcmVkIGEgLnNlcnZlcmRlZi4KLQkgKiBAcmV0dXJuIHNlcnZlclJ1bnRpbWVzCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWVbXSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKXsKLQkJIExpc3QgZGVmaW5pdGlvbkxpc3QgPSBmWG1sVXRpbHMuZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCk7Ci0JCSByZXR1cm4gKFNlcnZlclJ1bnRpbWVbXSlkZWZpbml0aW9uTGlzdC50b0FycmF5KG5ldyBTZXJ2ZXJSdW50aW1lW2RlZmluaXRpb25MaXN0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVmaW5pdGlvbnNDaGFuZ2VkKCl7CQotCQlYTUxVdGlscyB1dGlscyA9IG5ldyBYTUxVdGlscygpOwotCQlmWG1sVXRpbHMgPSB1dGlsczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY5YTM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmZpbGVzLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgU2VydmVyUnVudGltZSBkZWZpbml0aW9uIGZpbGVzLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwgCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGRlZmluaXRpb24gZm9yIHJ1bnRpbWUuIFJldHVybnMgbnVsbAotCSAqIGlmIHRoZSBydW50aW1lIGlzIG51bGwgb3Igbm90IGEgR2VuZXJpYyBzZXJ2ZXIgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEByZXR1cm4gc2VydmVyUnVudGltZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihJUnVudGltZSBydW50aW1lKQotCXsKLQkJaWYocnVudGltZT09bnVsbCkKLQkJCXJldHVybiBudWxsOwotCSAgICBHZW5lcmljU2VydmVyUnVudGltZSBkZWxlZ2F0ZSA9IChHZW5lcmljU2VydmVyUnVudGltZSlydW50aW1lLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLG51bGwpOwotCSAgICBpZihkZWxlZ2F0ZT09bnVsbCkKLQkgICAgCXJldHVybiBudWxsOwotCQlTdHJpbmcgc2VydmVyVHlwZSA9IGRlbGVnYXRlLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCU1hcCBwcm9wZXJ0aWVzID0gZGVsZWdhdGUuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCVNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IAotCQkJQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkuZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oc2VydmVyVHlwZSxwcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIGRlZmluaXRpb247Ci0JfQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBzZXJ2ZXIgY2xhc3NwYXRoIGVudHJ5IGFycmF5LgotCSAqCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIGNsYXNzcGF0aEVudHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRTZXJ2ZXJDbGFzc1BhdGhFbnRyeShJUnVudGltZSBydW50aW1lKQotCXsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24ocnVudGltZSk7Ci0JCWlmKGRlZmluaXRpb249PW51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZiA9IGRlZmluaXRpb24uZ2V0UHJvamVjdCgpLmdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotCQlBcnJheUxpc3QgZW50cnlMaXN0ID0gZ2V0Q2xhc3NwYXRoRW50cmllcyhyZWYsZGVmaW5pdGlvbixmYWxzZSk7Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pZW50cnlMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyeUxpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyAgc3RhdGljIEFycmF5TGlzdCBnZXRDbGFzc3BhdGhFbnRyaWVzKFN0cmluZyByZWYsIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiwgYm9vbGVhbiBpc0xhdW5jaCkgewotCQlDbGFzc3BhdGggY3AgPSBkZWZpbml0aW9uLmdldENsYXNzcGF0aChyZWYpOwotCQlJdGVyYXRvciBhcmNoaXZlcyA9IGNwLmdldEFyY2hpdmUoKS5pdGVyYXRvcigpOwotCQlBcnJheUxpc3QgZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoYXJjaGl2ZXMuaGFzTmV4dCgpKSB7Ci0JCQlBcmNoaXZlVHlwZSBhcmNoaXZlID0gKEFyY2hpdmVUeXBlKSBhcmNoaXZlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgaXRlbSA9IGRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhhcmNoaXZlLmdldFBhdGgoKSk7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBudWxsOwotCQkJaWYoaXNMYXVuY2gpCi0JCQkJZW50cnlMaXN0LmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KG5ldyBQYXRoKGl0ZW0pKSk7Ci0JCQllbHNlCi0JCQkJZW50cnlMaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoaXRlbSksbnVsbCxudWxsICkpOwotCQl9Ci0JCUl0ZXJhdG9yIGZpbGVTZXRzID0gY3AuZ2V0RmlsZXNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChmaWxlU2V0cy5oYXNOZXh0KCkpIHsKLQkJCUZpbGVzZXRUeXBlIGZpbGVzZXQgPSAoRmlsZXNldFR5cGUpIGZpbGVTZXRzLm5leHQoKTsKLQkJCVN0cmluZyBkaXIgPSBkZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZmlsZXNldC5nZXREaXIoKSk7Ci0JCQlJdGVyYXRvciBpbmNsdWRlcyA9IGZpbGVzZXQuZ2V0SW5jbHVkZSgpLml0ZXJhdG9yKCk7Ci0JCQlTdHJpbmdbXSBpbmNsc3RyID0gbmV3IFN0cmluZ1tmaWxlc2V0LmdldEluY2x1ZGUoKS5zaXplKCldOwotCQkJaW50IGk9MDsKLQkJCXdoaWxlIChpbmNsdWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlJbmNsdWRlVHlwZSBpbmNsID0gKEluY2x1ZGVUeXBlKSBpbmNsdWRlcy5uZXh0KCk7Ci0JCQkJaW5jbHN0cltpKytdID1kZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoaW5jbC5nZXROYW1lKCkpOwotCQkJfQotCQkJSXRlcmF0b3IgZXhjbHVkZXMgPSBmaWxlc2V0LmdldEV4Y2x1ZGUoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nW10gZXhjbHN0ciA9IG5ldyBTdHJpbmdbZmlsZXNldC5nZXRFeGNsdWRlKCkuc2l6ZSgpXTsKLQkJCWk9MDsKLQkJCXdoaWxlIChleGNsdWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlFeGNsdWRlVHlwZSBleGNsID0gKEV4Y2x1ZGVUeXBlKSBleGNsdWRlcy5uZXh0KCk7Ci0JCQkJZXhjbHN0cltpKytdID1kZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZXhjbC5nZXROYW1lKCkpOwotCQkJfQotCQkJRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLQkJCXNjYW5uZXIuc2V0QmFzZWRpcihkaXIpOwotCQkJc2Nhbm5lci5zZXRJbmNsdWRlcyhpbmNsc3RyKTsKLQkJCXNjYW5uZXIuc2V0RXhjbHVkZXMoZXhjbHN0cik7Ci0JCQlzY2FubmVyLnNjYW4oKTsKLQkJCVN0cmluZ1tdIGZpbGVzZXRGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlc2V0RmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgaXRlbSA9IGRpcisiLyIrZmlsZXNldEZpbGVzW2pdOwotCQkJCWlmKGlzTGF1bmNoKQotCQkJCQllbnRyeUxpc3QuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkobmV3IFBhdGgoaXRlbSkpKTsKLQkJCQllbHNlCi0JCQkJCWVudHJ5TGlzdC5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGl0ZW0pLG51bGwsbnVsbCApKTsKLQotCQkJfQotCQkKLQkJfQotCQlyZXR1cm4gZW50cnlMaXN0OwotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc2VydmVyRGVmaW5pdGlvbiBhbmQgbW9kdWxlIHJldHVybnMgdGhlIHB1Ymxpc2hlciBpZCAKLQkgKiB0aGF0IGhhbmRsZXMgdGhlIHB1Ymxpc2hpbmcgb2YgbW9kdWxlIHR5cGUgZm9yIHRoaXMgc2VydmVyRGVmaW5pdGlvbi4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIHNlcnZlckRlZmluaXRpb24KLQkgKiBAcmV0dXJuIHB1Ymxpc2hlciBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hlcklEKElNb2R1bGUgbW9kdWxlLCBTZXJ2ZXJSdW50aW1lIHNlcnZlckRlZmluaXRpb24pCi0JewotCQlpZihtb2R1bGU9PW51bGwgfHwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKT09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kdWxlIG0gPSBzZXJ2ZXJEZWZpbml0aW9uLmdldE1vZHVsZShtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpOwotCQlyZXR1cm4gbS5nZXRQdWJsaXNoZXJSZWZlcmVuY2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlOGM3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JLyoqCi0JICogVHJhY2UgbGV2ZWwgQ09ORklHCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JLyoqCi0JICogVHJhY2UgbGV2ZWwgV0FSTklORwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQkvKioKLQkgKiBUcmFjZSBsZXZlbCBTRVZFUkUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQkvKioKLQkgKiBUcmFjZSBsZXZlbCBGSU5FU1QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQkvKioKLQkgKiBUcmFjZSBsZXZlbCBGSU5FUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FUiA9IDQ7Ci0JCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwgY29uc3RhbnQKLQkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwgY29uc3RhbnQKLQkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHQgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcykgewotCQl0cmFjZShzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdCB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCXRyYWNlKEZJTkVTVCwgcywgdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BYnN0cmFjdE1vZHVsZUFzc2VtYmxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BYnN0cmFjdE1vZHVsZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDNkYjM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0JCQkKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5QdWJsaXNoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1vZHVsZSBhc3NlbWJsZXJzCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciB7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZSBmU2VydmVyZGVmaW5pdGlvbjsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBmTW9kdWxlOyAKLQlwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotCXByb3RlY3RlZCBJUGF0aCBmQXNzZW1ibGVSb290OwotCQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlcihJTW9kdWxlIG1vZHVsZSwgR2VuZXJpY1NlcnZlciBzZXJ2ZXIsIElQYXRoIGFzc2VtYmxlUm9vdCkKLQl7Ci0JCWZNb2R1bGU9bW9kdWxlOwotCQlmU2VydmVyZGVmaW5pdGlvbj1zZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotCQlmU2VydmVyPXNlcnZlcjsKLQkJZkFzc2VtYmxlUm9vdCA9IGFzc2VtYmxlUm9vdDsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZW1ibGUgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUGF0aCBhc3NlbWJsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JCi0JLyoqCi0JICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29uY3JldGUgbW9kdWxlIGFzc2VtYmxlcnMgZm9yIAotCSAqIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHR5cGVzLgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsJCQotCQkKLQkJcHVibGljIHN0YXRpYyBJUGF0aCBnZXREZWZhdWx0QXNzZW1ibGVSb290KElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlcikgewotCQkJUHJvamVjdE1vZHVsZSBwbSA9KFByb2plY3RNb2R1bGUpbW9kdWxlLmxvYWRBZGFwdGVyKFByb2plY3RNb2R1bGUuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFRlbXBEaXJlY3Rvcnkoc2VydmVyLmdldFNlcnZlcigpLmdldElkKCkpLmFwcGVuZChwbS5nZXRJZCgpKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgYSBjb25jcmV0ZSBtb2R1bGUgYXNzZW1ibGVyCi0JCSAqIAotCQkgKiBAcGFyYW0gbW9kdWxlCi0JCSAqIEBwYXJhbSBzZXJ2ZXIKLQkJICogQHJldHVybiBhc3NlbWJsZXIKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgZ2V0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlcikKLQkJewotCQkJcmV0dXJuIGdldE1vZHVsZUFzc2VtYmxlcihtb2R1bGUsIHNlcnZlciwgZ2V0RGVmYXVsdEFzc2VtYmxlUm9vdChtb2R1bGUsIHNlcnZlcikpOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyBhIGNvbmNyZXRlIG1vZHVsZSBhc3NlbWJsZXIgdGhhdCBhc3NlbWJsZXMgdW5kZXIgdGhlIHNwZWNpZmllZCByb290IHBhdGgKLQkJICogCi0JCSAqIEBwYXJhbSBtb2R1bGUKLQkJICogQHBhcmFtIHNlcnZlcgotCQkgKiBAcGFyYW0gYXNzZW1ibGVSb290Ci0JCSAqIEByZXR1cm4gYXNzZW1ibGVyCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIGdldE1vZHVsZUFzc2VtYmxlcihJTW9kdWxlIG1vZHVsZSwgR2VuZXJpY1NlcnZlciBzZXJ2ZXIsIElQYXRoIGFzc2VtYmxlUm9vdCkKLQkJewotCQkJaWYoaXNNb2R1bGVUeXBlKG1vZHVsZSwgImpzdC53ZWIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgV2FyTW9kdWxlQXNzZW1ibGVyKG1vZHVsZSxzZXJ2ZXIsYXNzZW1ibGVSb290KTsKLQkJCWlmKGlzTW9kdWxlVHlwZShtb2R1bGUsICJqc3QuZWFyIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEVhck1vZHVsZUFzc2VtYmxlcihtb2R1bGUsc2VydmVyLGFzc2VtYmxlUm9vdCk7Ci0JCQlyZXR1cm4gbmV3IERlZmF1bHRNb2R1bGVBc3NlbWJsZXIobW9kdWxlLHNlcnZlcixhc3NlbWJsZVJvb3QpOwotCQl9Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTW9kdWxlVHlwZShJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIG1vZHVsZVR5cGVJZCl7CQotCQkJaWYobW9kdWxlLmdldE1vZHVsZVR5cGUoKSE9bnVsbCAmJiBtb2R1bGVUeXBlSWQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFja01vZHVsZShJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGRlcGxveW1lbnRVbml0TmFtZSwgSVBhdGggZGVzdGluYXRpb24pdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkKLQkJU3RyaW5nIGRlc3QgPSBkZXN0aW5hdGlvbi5hcHBlbmQoZGVwbG95bWVudFVuaXROYW1lKS50b1N0cmluZygpOwotCQlNb2R1bGVQYWNrYWdlciBwYWNrYWdlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWNrYWdlciA9IG5ldyBNb2R1bGVQYWNrYWdlcihkZXN0LCBmYWxzZSk7Ci0JCQlQcm9qZWN0TW9kdWxlIHBtID0gKFByb2plY3RNb2R1bGUpIG1vZHVsZS5sb2FkQWRhcHRlcihQcm9qZWN0TW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IHBtLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZG9QYWNrTW9kdWxlKHJlc291cmNlc1tpXSwgcGFja2FnZXIpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCSJ1bmFibGUgdG8gYXNzZW1ibGUgbW9kdWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQkJZmluYWxseXsKLQkJCXRyeXsKLQkJCQlwYWNrYWdlci5maW5pc2hlZCgpOwotCQkJfQotCQkJY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJLy91bmhhbmRsZWQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1BhY2tNb2R1bGUoSU1vZHVsZVJlc291cmNlIHJlc291cmNlLCBNb2R1bGVQYWNrYWdlciBwYWNrYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uewotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCUlNb2R1bGVGb2xkZXIgbUZvbGRlciA9IChJTW9kdWxlRm9sZGVyKXJlc291cmNlOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1Gb2xkZXIubWVtYmVycygpOwotCi0JCQkJcGFja2FnZXIud3JpdGVGb2xkZXIocmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyByZXNvdXJjZXMhPSBudWxsICYmIGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZG9QYWNrTW9kdWxlKHJlc291cmNlc1tpXSwgcGFja2FnZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gcmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSkudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJCXBhY2thZ2VyLndyaXRlKGZpbGUsIGRlc3RpbmF0aW9uKTsKLQkJCQllbHNlIHsKLQkJCQkJRmlsZSBmaWxlMiA9IChGaWxlKSByZXNvdXJjZS5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJCQlwYWNrYWdlci53cml0ZShmaWxlMiwgZGVzdGluYXRpb24pOwotCQkJCX0KLQkJCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggY29weU1vZHVsZShJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVByb2plY3RNb2R1bGUgcG0gPShQcm9qZWN0TW9kdWxlKW1vZHVsZS5sb2FkQWRhcHRlcihQcm9qZWN0TW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLnB1Ymxpc2hTbWFydChwbS5tZW1iZXJzKCksIGZBc3NlbWJsZVJvb3QsIG1vbml0b3IpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmxlbmd0aCA+IDApCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOwotCQlyZXR1cm4gZkFzc2VtYmxlUm9vdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0FudFB1Ymxpc2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BbnRQdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1YzUzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0FudFB1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNQdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbnQgYmFzZWQgcHVibGlzaGVyLiBBbGwgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24gZmlsZQotICogYXJlIHBhc3NlZCBpbnRvIHRoZSBBTlQgYnVpbGQgZmlsZSBhcyBwcm9wZXJ0aWVzLiBJbiBhZGRpdGlvbiB0byB0aGUKLSAqIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24gPEk+bW9kdWxlLmRpcjwvST4sCi0gKiA8ST5tb2R1bGUubmFtZSw8L0k+IGFuZCA8ST5zZXJ2ZXIucHVibGlzaC5kaXI8L0k+IGFyZSBjb21wdXRlZCBhbmQgcGFzc2VkCi0gKiB0byB0aGUgZGVmaW5pdGlvbiBmaWxlLgotICogPHVsPgotICogPGxpPm1vZHVsZS5kaXI6IGluY2x1ZGVzIHRoZSByb290IG9mIHRoZSBtb2R1bGUgcHJvamVjdCBmaWxlPC9saT4KLSAqIDxsaT5tb2R1bGUubmFtZTogdGhlIG5hbWUgb2YgdGhlIG1vZHVsZTwvbGk+Ci0gKiA8bGk+c2VydmVyLnB1Ymxpc2guZGlyOiB0aGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgZGVwbG95bWVudCB1bml0czwvbGk+Ci0gKiA8bGk+cHJvamVjdC53b3JraW5nLmRpcjogdGhlIHdvcmtpbmcgZGlyIG9mIHRoZSBwcm9qZWN0IHRoYXQgZGVwbG95ZWQgbW9kdWxlCi0gKiBpcyBpbjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXIgZXh0ZW5kcyBHZW5lcmljUHVibGlzaGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MX1BSRUZJWCA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBwdWJsaXNoZXIgaWQgZm9yIEFOVCBwdWJsaXNoZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NFUlZFUl9QVUJMSVNIX0RJUiA9ICJzZXJ2ZXIucHVibGlzaC5kaXIiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPSkVDVF9XT1JLSU5HX0RJUiA9ICJwcm9qZWN0LndvcmtpbmcuZGlyIjsvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX01PRFVMRV9ESVIgPSAibW9kdWxlLmRpciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9NT0RVTEVfTkFNRSA9ICJtb2R1bGUubmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT05URVhUX1JPT1QgPSAiY29udGV4dFJvb3QiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPSkVDVF9OQU1FID0gInByb2plY3QubmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCA9ICJ0YXJnZXQucHVibGlzaC4iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVU5QVUJMSVNIX1RBUkdFVF9QUkVGSVggPSAidGFyZ2V0LnVucHVibGlzaC4iOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTkFNRV9CVUlMRF9GSUxFID0gImJ1aWxkLmZpbGUiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTU9EVUxFX0FSQ0hJVkVfTkFNRSA9ICJtb2R1bGUuYXJjaGl2ZS5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuc2VydmVyLmNvcmUubW9kZWwuSVB1Ymxpc2hlciNwdWJsaXNoKG9yZy5lY2xpcHNlLnd0cC5zZXJ2ZXIuY29yZS5yZXNvdXJjZXMuSU1vZHVsZVJlc291cmNlW10sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2goSU1vZHVsZUFydGlmYWN0W10gcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZ2V0TW9kdWxlKCkubGVuZ3RoID4gMSkvLyBvbmx5IHJlc3BvbmQgdG8gcm9vdCBtb2R1bGUgY2FsbHMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWFzc2VtYmxlTW9kdWxlKG1vbml0b3IpOwotCQkJRmlsZSBmaWxlID0gZ2V0Q3VzdG9tQnVpbGRGaWxlKCk7Ci0JCQlpZiAoIGZpbGUgPT0gbnVsbCl7Ly8gbm8gdXNlciBzZWxlY3RlZCBidWlsZCBmaWxlIHVzZSB0aGUgYWRhcHRlciBkZWZhdWx0LgotCQkJCWZpbGUgPSBjb21wdXRlQnVpbGRGaWxlKCk7Ci0JCQl9Ci0JCQlydW5BbnQoZmlsZS50b1N0cmluZygpLCBnZXRQdWJsaXNoVGFyZ2V0c0Zvck1vZHVsZSgpLCBnZXRQdWJsaXNoUHJvcGVydGllcygpLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUHVibGlzaEFudHB1Ymxpc2hlciwgZSk7Ci0JCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cocyk7Ci0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IHMgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlbWJsZU1vZHVsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgYXNzZW1ibGVyID0gQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIuRmFjdG9yeS5nZXRNb2R1bGVBc3NlbWJsZXIoZ2V0TW9kdWxlKClbMF0sIGdldFNlcnZlcigpKTsKLQkJYXNzZW1ibGVyLmFzc2VtYmxlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1c3RvbSBidWlsZCBmaWxlIHRoYXQgdXNlciBzZWxlY3RlZC4gT3IgcmV0dXJucyBudWxsOwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEN1c3RvbUJ1aWxkRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQoIEdlbmVyaWNTZXJ2ZXIuUFJPUF9DVVNUT01fQlVJTERfU0NSSVBUICk7Ci0JCWlmKCBmaWxlbmFtZSAhPSBudWxsICYmIGZpbGVuYW1lLmxlbmd0aCgpPjAgKXsKLQkJCWZpbGVuYW1lID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKCBmaWxlbmFtZSApOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQkJaWYgKCAhZmlsZS5leGlzdHMoKSApewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCSJTZWxlY3RlZCBidWlsZCBmaWxlIGRvZXMgbm90IGV4aXN0LiIpKTsKLQkJCX0KLQkJCXJldHVybiBmaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGZpbGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEZpbGUgY29tcHV0ZUJ1aWxkRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpKTsKLQkJVVJMIGJ1bmRsZVVybCA9IGJ1bmRsZS5nZXRFbnRyeShnZXRCdWlsZEZpbGUoKSk7Ci0JCVVSTCBmaWxlVVJMID0gRmlsZVV0aWwucmVzb2x2ZVVSTChidW5kbGVVcmwpOwotCQlpZiAoZmlsZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyhKQVJfUFJPVE9DT0xfUFJFRklYKSkgewotCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZVVSTC5nZXRQYXRoKCk7Ci0JCQkJU3RyaW5nIGphcm5hbWUgPSBmaWxlVVJMLmdldEZpbGUoKS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUuaW5kZXhPZignIScpKTsKLQotCQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoamFybmFtZSkuZ2V0RmlsZSgpKTsKLQkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOwotCQkJCUZpbGUgdG1wRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKGdldEJ1aWxkRmlsZSgpLCBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotCQkJCVN0cmluZyBlbnRyeW5hbWUgPSBnZXRCdWlsZEZpbGUoKTsKLQkJCQlpZiAoZW50cnluYW1lLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5bmFtZSA9IGVudHJ5bmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoZW50cnluYW1lKTsKLQkJCQlpcyA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJRmlsZVV0aWwuY29weShpcywgb3MpOwotCQkJCXJldHVybiB0bXBGaWxlOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUlTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICJlcnJvciBjcmVhdGluZyB0ZW1wb3JhcnkgYnVpbGQgZmlsZSIsIGUpOy8vJE5PTi1OTFMtMSQKLQkJCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cocyk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCQlvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IAotCQlyZXR1cm4gRmlsZVV0aWwucmVzb2x2ZUZpbGUoZmlsZVVSTCk7Ci0JCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSB7Ci0JCXJldHVybiBkb0dldFRhcmdldHMoTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCArIGdldE1vZHVsZVR5cGVJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbnB1Ymxpc2hUYXJnZXRzRm9yTW9kdWxlKCkgewotCQlyZXR1cm4gZG9HZXRUYXJnZXRzKE1PRFVMRV9VTlBVQkxJU0hfVEFSR0VUX1BSRUZJWCArIGdldE1vZHVsZVR5cGVJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkb0dldFRhcmdldHMoU3RyaW5nIGRhdGFuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGF0YW5hbWUuZXF1YWxzKGRhdGEuZ2V0RGF0YW5hbWUoKSkpIHsKLQkJCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuZ2V0RGF0YXZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNb2R1bGVUeXBlSWQoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGUoKVswXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRCdWlsZEZpbGUoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoREFUQV9OQU1FX0JVSUxEX0ZJTEUuZXF1YWxzKGRhdGEuZ2V0RGF0YW5hbWUoKSkpCi0JCQkJcmV0dXJuIGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZGF0YS5nZXREYXRhdmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0UHVibGlzaFByb3BlcnRpZXMoKSB7Ci0JCU1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gYnVpbGQgZmlsZS4KLQkJTWFwIHNlcnZlclByb3BlcnRpZXMgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCXByb3BlcnRpZXMucHV0QWxsKHNlcnZlclByb3BlcnRpZXMpOwotCQlJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocHJvcGVydHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIHByb3BlcnR5SXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlwcm9wcy5wdXQocHJvcGVydHksIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSk7Ci0JCX0KLQkJTW9kdWxlIG1vZHVsZSA9IGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldE1vZHVsZShnZXRNb2R1bGVUeXBlSWQoKSk7Ci0JCVN0cmluZyBtb2REaXIgPSBtb2R1bGUuZ2V0UHVibGlzaERpcigpOwotCQltb2REaXIgPSBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKG1vZERpcik7Ci0JCUlNb2R1bGUgd2ViTW9kdWxlID0gZ2V0TW9kdWxlKClbMF07Ci0KLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBndWVzc01vZHVsZU5hbWUod2ViTW9kdWxlKTsKLQkJU3RyaW5nIGNvbnRleHRSb290ID0gZ3Vlc3NDb250ZXh0Um9vdCh3ZWJNb2R1bGUpOwotCQlwcm9wcy5wdXQoUFJPUF9QUk9KRUNUX1dPUktJTkdfRElSLCBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCXByb3BzLnB1dChQUk9QX01PRFVMRV9OQU1FLCBtb2R1bGVOYW1lKTsKLQkJcHJvcHMucHV0KFBST1BfQ09OVEVYVF9ST09ULCBjb250ZXh0Um9vdCk7Ci0JCWlmIChpc01vZHVsZVR5cGUod2ViTW9kdWxlLCAianN0LmVhciIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJcHJvcHMucHV0KFBST1BfTU9EVUxFX0FSQ0hJVkVfTkFNRSwgbW9kdWxlTmFtZSArICIuZWFyIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChpc01vZHVsZVR5cGUod2ViTW9kdWxlLCAianN0LndlYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BzLnB1dChQUk9QX01PRFVMRV9BUkNISVZFX05BTUUsIG1vZHVsZU5hbWUgKyAiLndhciIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoaXNNb2R1bGVUeXBlKHdlYk1vZHVsZSwgImpzdC5lamIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9wcy5wdXQoUFJPUF9NT0RVTEVfQVJDSElWRV9OQU1FLCBtb2R1bGVOYW1lICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh3ZWJNb2R1bGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCXByb3BzLnB1dChQUk9QX01PRFVMRV9ESVIsIGdldE1vZHVsZVdvcmtpbmdEaXIoKS50b1N0cmluZygpKTsKLQkJCXByb3BzLnB1dChQUk9QX1BST0pFQ1RfTkFNRSwgd2ViTW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0JCXByb3BzLnB1dChQUk9QX1NFUlZFUl9QVUJMSVNIX0RJUiwgbW9kRGlyKTsKLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0TW9kdWxlV29ya2luZ0RpcigpIHsKLQkJcmV0dXJuIGdldFByb2plY3RXb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZ2V0TW9kdWxlKClbMF0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VGVtcERpcmVjdG9yeShnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXIoKS5nZXRJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBndWVzc01vZHVsZU5hbWUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhnZXRNb2R1bGVUeXBlSWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgZ2V0TW9kdWxlKClbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbW9kdWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRVUkkobW9kdWxlKTsKLQkJCW1vZHVsZU5hbWUgPSBjb250ZXh0Um9vdC5zdWJzdHJpbmcoMCwgY29udGV4dFJvb3QubGFzdEluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ3Vlc3NDb250ZXh0Um9vdChJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGd1ZXNzTW9kdWxlTmFtZShtb2R1bGUpOwotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGVOYW1lOwotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhnZXRNb2R1bGVUeXBlSWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgZ2V0TW9kdWxlKClbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQljb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCWlmIChjb250ZXh0Um9vdCA9PSBudWxsIHx8IGNvbnRleHRSb290Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJY29udGV4dFJvb3QgPSBtb2R1bGVOYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGV4dFJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bkFudChTdHJpbmcgYnVpbGRGaWxlLCBTdHJpbmcgdGFyZ2V0cywgTWFwIHByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBsYXVuY2hNYW5hZ2VyCi0JCQkJLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5hbnRMYXVuY2hlck1pc3NpbmcsIG51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCX0KLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IHR5cGUubmV3SW5zdGFuY2UobnVsbCwgcHJvcGVydGllcy5nZXQoUFJPUF9NT0RVTEVfTkFNRSkgKyAiIG1vZHVsZSBwdWJsaXNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRDb250YWluZXIobnVsbCk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIGJ1aWxkRmlsZSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEhfUFJPVklERVIsICJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgdGFyZ2V0cyk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTLCBwcm9wZXJ0aWVzKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIGZhbHNlKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfQ0FQVFVSRV9JTl9DT05TT0xFLCB0cnVlKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfUFJJVkFURSwgdHJ1ZSk7Ci0KLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NPVVJDRV9QQVRIX1BST1ZJREVSLCAib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwgZ2V0U2VydmVyUnVudGltZSgpLmdldFZNSW5zdGFsbCgpLmdldE5hbWUoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX1RZUEUsIGdldFNlcnZlclJ1bnRpbWUoKS5nZXRWTUluc3RhbGwoKS5nZXRWTUluc3RhbGxUeXBlKCkKLQkJCQkuZ2V0SWQoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwKLQkJCQkib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuSW50ZXJuYWxBbnRSdW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRBdHRyaWJ1dGUoRGVidWdQbHVnaW4uQVRUUl9QUk9DRVNTX0ZBQ1RPUllfSUQsIElBbnRVSUNvbnN0YW50cy5SRU1PVEVfQU5UX1BST0NFU1NfRkFDVE9SWV9JRCk7Ci0KLQkJc2V0dXBBbnRMYXVuY2hDb25maWd1cmF0aW9uKHdjKTsKLQotICAgICAgICBpZiAoICFtb25pdG9yLmlzQ2FuY2VsZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IHdjLmRvU2F2ZSgpOyAgICAgICAgICAKLSAgICAgICAgICAgIGxhdW5jaENvbmZpZy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfSAgICAKLQl9Ci0KLQkvKioKLQkgKiBIb29rIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gd2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFudExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YykgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01vZHVsZVR5cGUoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBtb2R1bGVUeXBlSWQpIHsKLQkJaWYgKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkgIT0gbnVsbCAmJiBtb2R1bGVUeXBlSWQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUuR2VuZXJpY1B1Ymxpc2hlciN1bnB1Ymxpc2gob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHVucHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlpZiAoZ2V0TW9kdWxlKCkubGVuZ3RoID4gMSkvLyBvbmx5IHJlc3BvbmQgdG8gcm9vdCBtb2R1bGUgY2FsbHMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGNvbXB1dGVCdWlsZEZpbGUoKTsKLQkJCXJ1bkFudChmaWxlLnRvU3RyaW5nKCksIGdldFVucHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSwgZ2V0UHVibGlzaFByb3BlcnRpZXMoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclJlbW92ZU1vZHVsZUFudHB1Ymxpc2hlciwgZSk7Ci0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IHMgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0RlZmF1bHRNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRGVmYXVsdE1vZHVsZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNlZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRGVmYXVsdE1vZHVsZUFzc2VtYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBEZWZhdWx0IG1vZHVsZSBhc3NlbWJsZXIgdGhhdCBiYXNpY2FsbHkgY29waWVzIHRoZSBjb250ZW50cy4KLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgewotCQotCXByb3RlY3RlZCBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KSB7Ci0JCXN1cGVyKG1vZHVsZSwgc2VydmVyLCBhc3NlbWJsZVJvb3QpOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggYXNzZW1ibGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb3B5TW9kdWxlKGZNb2R1bGUsbW9uaXRvcik7CQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9FYXJNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRWFyTW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDc2OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9FYXJNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIFV0aWxpdHkgZm9yIEVBUiBtb2R1bGUgYXNzZW1ibHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFYXJNb2R1bGVBc3NlbWJsZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciB7Ci0KLQlwcm90ZWN0ZWQgRWFyTW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KQotCXsKLQkJc3VwZXIobW9kdWxlLCBzZXJ2ZXIsIGFzc2VtYmxlUm9vdCk7Ci0JfQotCi0JcHVibGljIElQYXRoIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCUlQYXRoIHBhcmVudCA9Y29weU1vZHVsZShmTW9kdWxlLG1vbml0b3IpOwotCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhck1vZHVsZSA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKWZNb2R1bGUubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7Ci0JCUlNb2R1bGVbXSBjaGlsZE1vZHVsZXMgPSBlYXJNb2R1bGUuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBjaGlsZE1vZHVsZXNbaV07Ci0JCQlTdHJpbmcgdXJpID0gZWFyTW9kdWxlLmdldFVSSShtb2R1bGUpOwotCQkJaWYodXJpPT1udWxsKXsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsCSJ1bmFibGUgdG8gYXNzZW1ibGUgbW9kdWxlIG51bGwgdXJpIixudWxsICk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJfQotCQkJaWYoIHNob3VsZFJlcGFjayggbW9kdWxlICkgKXsJCi0JCQkgICAgcGFja01vZHVsZShtb2R1bGUsdXJpLCBwYXJlbnQpOwotICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCS8qKgotICAgICAqIENoZWNrcyBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgcHVibGlzaGVkIHJlc291cmNlcy4KLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICogQHJldHVybiBtb2R1bGUgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZXBhY2soIElNb2R1bGUgbW9kdWxlICkgewotICAgICAgICBmaW5hbCBTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgZlNlcnZlci5nZXRTZXJ2ZXIoKTsKLSAgICAgICAgZmluYWwgSU1vZHVsZVtdIG1vZHVsZXMgPXttb2R1bGV9OyAKLSAgICAgICAgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YSggbW9kdWxlcyApOwotICAgICAgICByZXR1cm4gZGVsdGFzLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFja01vZHVsZShJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGRlcGxveW1lbnRVbml0TmFtZSwgSVBhdGggZGVzdGluYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscygianN0LndlYiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIGFzc2VtYmxlcj0gQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIuRmFjdG9yeS5nZXRNb2R1bGVBc3NlbWJsZXIobW9kdWxlLCBmU2VydmVyKTsKLQkJCUlQYXRoIHdlYkFwcFBhdGggPSBhc3NlbWJsZXIuYXNzZW1ibGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlTdHJpbmcgcmVhbERlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uYXBwZW5kKGRlcGxveW1lbnRVbml0TmFtZSkudG9TdHJpbmcoKTsKLQkJCU1vZHVsZVBhY2thZ2VyIHBhY2thZ2VyPW51bGw7Ci0JCQl0cnkgewotCQkJCXBhY2thZ2VyID1uZXcgTW9kdWxlUGFja2FnZXIocmVhbERlc3RpbmF0aW9uLGZhbHNlKTsKLQkJCQlwYWNrYWdlci5wYWNrKHdlYkFwcFBhdGgudG9GaWxlKCksd2ViQXBwUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJInVuYWJsZSB0byBhc3NlbWJsZSBtb2R1bGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQl9Ci0JCQlmaW5hbGx5ewotCQkJCWlmKHBhY2thZ2VyIT1udWxsKQotCQkJCXsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlwYWNrYWdlci5maW5pc2hlZCgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBVbmhhbmRsZWQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQkJCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdXBlci5wYWNrTW9kdWxlKG1vZHVsZSwgZGVwbG95bWVudFVuaXROYW1lLCBkZXN0aW5hdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL01vZHVsZVBhY2thZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL01vZHVsZVBhY2thZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmM0ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9Nb2R1bGVQYWNrYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0qIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBQYWNrYWdlcyByZXNvdXJjZXMgdG8gYSAuemlwIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVBhY2thZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfU0VQRVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBKYXJPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWFuaWZlc3RDb250ZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDb21wcmVzc2lvbiA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21wcmVzcyBib29sZWFuCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE1vZHVsZVBhY2thZ2VyKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBjb21wcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUGF0aCBkaXJlY3RvcnlQYXRoID0gbmV3IFBhdGgoZmlsZW5hbWUpOwotCQlkaXJlY3RvcnlQYXRoID0gKFBhdGgpIGRpcmVjdG9yeVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlGaWxlIG5ld1ppcEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnlQYXRoLnRvU3RyaW5nKCkpOwotCQluZXdaaXBGaWxlLm1rZGlycygpOwotCQlvdXRwdXRTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7IAotCQl1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotCX0KLQotCS8qKgotCSAqIERvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnRseS1vcGVuIC56aXAKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBFbnRyeSB3aXRoIHRoZSBwYXNzZWQgcGF0aG5hbWUgYW5kIGNvbnRlbnRzLCBhbmQgd3JpdGUgaXQgdG8gdGhlIGN1cnJlbnQKLQkgKiBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShTdHJpbmcgcGF0aG5hbWUsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkocGF0aG5hbWUpOwotCi0JCS8vIGlmIHRoZSBjb250ZW50cyBhcmUgYmVpbmcgY29tcHJlc3NlZCB0aGVuIHdlIGdldCB0aGUgYmVsb3cgZm9yIGZyZWUuCi0JCWlmICghdXNlQ29tcHJlc3Npb24pIHsKLQkJCW5ld0VudHJ5LnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOwotCQkJbmV3RW50cnkuc2V0U2l6ZShjb250ZW50cy5sZW5ndGgpOwotCQkJQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0JCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRlbnRzKTsKLQkJCW5ld0VudHJ5LnNldENyYyhjaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlKGNvbnRlbnRzKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25QYXRoCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRm9sZGVyKFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghZGVzdGluYXRpb25QYXRoLmVuZHNXaXRoKEpBUl9GSUxFX1NFUEVSQVRPUiApKSAKLQkJCWRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aCArIEpBUl9GSUxFX1NFUEVSQVRPUjsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkoZGVzdGluYXRpb25QYXRoKTsKLQkJb3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgY3VycmVudCBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSUZpbGUgcmVzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudFN0cmVhbSA9IHJlc291cmNlLmdldENvbnRlbnRzKGZhbHNlKTsKLQkJCXdyaXRlKGNvbnRlbnRTdHJlYW0sIGRlc3RpbmF0aW9uUGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKQotCQkJCWNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBwYXNzZWQgcmVzb3VyY2UgdG8gdGhlIGN1cnJlbnQgYXJjaGl2ZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgamF2YS5pby5JRmlsZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXNvdXJjZSk7Ci0JCQl3cml0ZShjb250ZW50U3RyZWFtLCBkZXN0aW5hdGlvblBhdGgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkKLQkJCQljb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFN0cmVhbQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWludCBjaHVua1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOwotCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtjaHVua1NpemVdOwotCQkJaW50IG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0KLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dHB1dC53cml0ZShyZWFkQnVmZmVyKTsKLQkJCQluID0gY29udGVudFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCW91dHB1dC5jbG9zZSgpOwotCQl9Ci0KLQkJd3JpdGUoZGVzdGluYXRpb25QYXRoLCBvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCQotCS8qKgotCSAqIHBhY2sgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHJvb3QKLQkgKiBAcGFyYW0gZGlyZWN0b3J5Ci0JICogQHBhcmFtIHJvb3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFjayhGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIHJvb3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICBpZiAoIGZpbGVzID09IG51bGwgKXsKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAJU3RyaW5nIHJlbGF0aXZlRm9sZGVyID0gbWFrZVJlbGF0aXZlKCBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwgcm9vdCApOwotICAgICAgICAgICAgaWYoIGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCWlmKCByZWxhdGl2ZUZvbGRlciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ly8gc2hvdWxkIGFsd2F5cyBiZSB0cnVlCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlRm9sZGVyKCByZWxhdGl2ZUZvbGRlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYWNrKCBmaWxlc1tpXSwgcm9vdCApOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJaWYoIHJlbGF0aXZlRm9sZGVyICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsvLyBzaG91bGQgYWx3YXlzIGJlIHRydWUKLSAgICAgICAgICAgICAgICAgICAgd3JpdGUoIGZpbGVzW2ldLCByZWxhdGl2ZUZvbGRlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCS8qKgotCSAqIE1ha2UgZGlyZWN0b3J5bmFtZSByZWxhdGl2ZSB0byByb290Ci0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHJvb3QpCi0JewotCQlTdHJpbmcgZm9sZGVyPW51bGw7Ci0JCWlmKGZpbGVOYW1lLnN0YXJ0c1dpdGgocm9vdCkpCi0JCXsKLQkJCWZvbGRlcj1maWxlTmFtZS5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSk7Ci0JCX0KLSAgICAgICAgZm9sZGVyID0gZm9sZGVyLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChmb2xkZXIubGVuZ3RoKCkgPiAwICYmIGZvbGRlci5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gZm9sZGVyOwkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvV2FyTW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzM1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotCi0vKioKLSAqIEFzc2VtYmx5IHV0aWxpdHkgZm9yIHdhciBtb2R1bGVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJNb2R1bGVBc3NlbWJsZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciB7Ci0JCi0JcHJvdGVjdGVkIFdhck1vZHVsZUFzc2VtYmxlcihJTW9kdWxlIG1vZHVsZSwgR2VuZXJpY1NlcnZlciBzZXJ2ZXIsIElQYXRoIGFzc2VtYmxlUm9vdCkKLQl7Ci0JCXN1cGVyKG1vZHVsZSwgc2VydmVyLCBhc3NlbWJsZVJvb3QpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBhc3NlbWJsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlJUGF0aCBwYXJlbnQgPWNvcHlNb2R1bGUoZk1vZHVsZSxtb25pdG9yKTsKLQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSlmTW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQlJTW9kdWxlW10gY2hpbGRNb2R1bGVzID0gd2ViTW9kdWxlLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gY2hpbGRNb2R1bGVzW2ldOwotCQkJcGFja01vZHVsZShtb2R1bGUsIHdlYk1vZHVsZS5nZXRVUkkobW9kdWxlKSwgcGFyZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRXh0ZW5zaW9uUG9pbnRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvY29yZS91dGlsL0V4dGVuc2lvblBvaW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODUzZDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRXh0ZW5zaW9uUG9pbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLS8qKgotICogVXRpbGl0aWVzIGZvciBoYW5kbGluZyB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUG9pbnRVdGlsIHsKLSAgICAvKioKLSAgICAgKiBzZXJ2ZXJkZWZpbml0aW9uIGV4dGVuc2lvbiBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEID0gInNlcnZlcmRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRURFRklOSVRJT05fRVhURU5TSU9OX0lEID0gInJ1bnRpbWVkZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDUFVCTElTSEVSX0VYVEVOU0lPTl9JRCA9ICJnZW5lcmljcHVibGlzaGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX1RZUEUgPSAic2VydmVyVHlwZXMiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgc2VydmVyZGVmaW5pdGlvbiBleHRlbnNpb25zCi0gICAgICogQHJldHVybiBzZXJ2ZXJkZWZpbml0aW9uIEV4dGVuc2lvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBnZXRHZW5lcmljU2VydmVyRGVmaW5pdGlvbkV4dGVuc2lvbnMoKXsKLSAgICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoQ29yZVBsdWdpbi5QTFVHSU5fSUQrIi4iK1NFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcnVudGltZWRlZmluaXRpb24gZXh0ZW5zaW9ucwotICAgICAqIEByZXR1cm4gcnVudGltZWRlZmluaXRpb24gRXh0ZW5zaW9ucwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEdlbmVyaWNTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbkV4dGVuc2lvbnMoKXsKLSAgICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoQ29yZVBsdWdpbi5QTFVHSU5fSUQrIi4iK1JVTlRJTUVERUZJTklUSU9OX0VYVEVOU0lPTl9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwdWJsaXNoZXIgZXh0ZW5zaW9ucwotICAgICAqIEByZXR1cm4gZ2VuZXJpY3B1Ymxpc2hlciBleHRlbnNpb25zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRXh0ZW5zaW9uW10gZ2V0R2VuZXJpY1B1Ymxpc2hlckV4dGVuc2lvbigpewotICAgICAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhDb3JlUGx1Z2luLlBMVUdJTl9JRCsiLiIrR0VORVJJQ1BVQkxJU0hFUl9FWFRFTlNJT05fSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEV4dGVuc2lvbnMoU3RyaW5nIGV4dGVuc2lvbklkKXsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PWdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvbklkKTsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zOwotICAgIH0KLSAKLSAgICBwcml2YXRlIHN0YXRpYyBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoU3RyaW5nIGlkKQotICAgIHsKLSAgICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChpZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25Qb2ludDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbgotICAgICAqIEByZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudHMoSUV4dGVuc2lvbiBleHRlbnNpb24pewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uIT1udWxsP2V4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTpudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgbGlzdGVuZXIgdG8gZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWdpc3RyeUxpc3RlbmVyKElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2Ygc2VydmVycyB3aXRoIHRoZSBnaXZlbiBsYXVuY2ggY29uZmlndXJhdGlvbiBJRC4KLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGlzIG5vbmUuCi0gICAgICogQHBhcmFtIGxhdW5jaENvbmZpZ0lkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZXNGcm9tTGF1bmNoQ29uZmlnKFN0cmluZyBsYXVuY2hDb25maWdJZCl7Ci0gICAgICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrICkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGlkID0gIGNmW2ldLmdldEF0dHJpYnV0ZSggImxhdW5jaENvbmZpZ0lkIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5lcXVhbHMoIGxhdW5jaENvbmZpZ0lkICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoIGNmW2ldLmdldEF0dHJpYnV0ZSggImlkIiApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICB9OwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9GaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjEwNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgZmlsZSBvcGVyYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JCi0JCi0JLyoqCi0JICogUmV0dXJucyBhIHJlc29sdmVkIGVxdWl2YWxlbnQgb2YgdXJsLCB1c2Ugd2l0aCB0aGUgCi0JICogcGxhdGZvcm0gcmVsYXRpdmUgdXJscwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIHJlc29sdmVVUkwoVVJMIHVybCl7Ci0JCXRyeXsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCX1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGlyCi0JICogQHJldHVybiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGlyKXsKLQkJaWYobmFtZT09bnVsbCB8fCBkaXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJRmlsZSB0ZW1wPW51bGw7Ci0JCVN0cmluZyBmaWxlUGF0aDsKLQkJZmlsZVBhdGggPSBuYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygxKTsKLQkJdGVtcCA9IG5ldyBGaWxlKGRpciwgZmlsZVBhdGgpOwotCQl2ZXJpZnlQYXRoKHRlbXAsdHJ1ZSk7Ci0JCXRlbXAuZGVsZXRlT25FeGl0KCk7Ci0JCXJldHVybiB0ZW1wOwotCQotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgYSBmaWxlCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIG91dHB1dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uewotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCWludCBsZW4gPSBpbnB1dC5yZWFkKGJ1Zik7Ci0JCXdoaWxlKGxlbiE9LTEpewotCQkJb3V0cHV0LndyaXRlKGJ1ZiwwLGxlbik7Ci0JCQlsZW49IGlucHV0LnJlYWQoYnVmKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVBhdGgoRmlsZSBwYXRoLCBib29sZWFuIGlzRmlsZSkgewotCQkvLyBpZiB3ZSBhcmUgZXhwZWN0aW5nIGEgZmlsZSBiYWNrIG9mZiAxIHBhdGggZWxlbWVudAotCQlpZiAoaXNGaWxlKSB7Ci0JCQlpZiAocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBhIGZpbGUKLQkJCQlwYXRoID0gcGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaXNGaWxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxyZWFkeSBleGlzdHMgLi4uIGp1c3QgcmV0dXJuCi0JCWlmIChwYXRoLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQkvLyBkb2VzIG5vdCBleGlzdCAuLi4gZW5zdXJlIHBhcmVudCBleGlzdHMKLQkJRmlsZSBwYXJlbnQgPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJdmVyaWZ5UGF0aChwYXJlbnQsIGZhbHNlKTsKLQkJLy8gZW5zdXJlIGRpcmVjdG9yaWVzIGFyZSBtYWRlLiBNYXJrIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGZvciBkZWxldGlvbgotCQlpZiAoIWlzRmlsZSkKLQkJCXBhdGgubWtkaXIoKTsKLQkJcGF0aC5kZWxldGVPbkV4aXQoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBhIFVSTCB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqIEByZXR1cm4gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSByZXNvbHZlRmlsZShVUkwgdXJsKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVybCA9IHJlc29sdmVVUkwodXJsKTsKLSAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocmVzb2x2ZWRVcmwuZ2V0UHJvdG9jb2woKSwgcmVzb2x2ZWRVcmwuZ2V0SG9zdCgpLHJlc29sdmVkVXJsLmdldFBhdGgoKSwgcmVzb2x2ZWRVcmwuZ2V0UXVlcnkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvL2lnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvU2VydmVyUnVudGltZU1lcmdlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9TZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjRiNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9TZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FwZSBDbGVhciBTb2Z0d2FyZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0KLS8qKgotICogQ29tYmluZXMgYSBydW50aW1lZGVmIGZpbGVzCi0gKiAKLSAqIC0gcHJvcGVydGllcwotICogLSBjbGFzc3BhdGhzCi0gKiAKLSAqIGVudHJpZXMgd2l0aCBhIHNlcnZlcmRlZiwgaWYgdGhlIHNlcnZlcmRlZiBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgCi0gKiB0aGVtIC0gY29udGFpbnMgY2hlY2sgaXMgZG9uZSBieSBpZC4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZGF2aWQuYmxhY2tAY2FwZWNsZWFyLmNvbSI+RGF2aWQgQmxhY2s8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsIHsKLQotICAgIC8qKgotICAgICAqIENvbWJpbmVzIGEgcnVudGltZSBkZWZpbml0aW9uIGFuZCBhIHNlcnZlciBkZWZpbml0aW9uIAotICAgICAqIGludG8gYSBzaW5nbGUgbG9naWNhbCA8Y29kZT5TZXJ2ZXJSdW50aW1lPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmVyZGVmCi0gICAgICogQHBhcmFtIHJ1bnRpbWVkZWYKLSAgICAgKiBAcmV0dXJuIHNlcnZlcmRlZgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyUnVudGltZSBjb21iaW5lKFNlcnZlclJ1bnRpbWUgc2VydmVyZGVmLCBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWVkZWYpIHsKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBZGQgcHJvcGVydGllcyBmcm9tIHJ1bnRpbWVkZWYgdG8gc2VydmVyZGVmIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsCi0gICAgICAgICAqIHRoaXMgZW5zdXJlcyB0aGF0OgotICAgICAgICAgKiAKLSAgICAgICAgICogKDEpIHdoaWxlIHdlIGFyZSBhZmZlY3RpbmcgdGhlIGNhY2hlZCBjb3B5IG9mIHNlcnZlcmRlZiwgaXQgaXMgYWx3YXlzCi0gICAgICAgICAqICAgICByZXF1aXJlZCB0byBiZSBjb21iaW5lZCB3aXRoIGl0cyBydW50aW1lZGVmIChpZiB0aGVyZSBpcyBvbmUpLCBhbmQKLSAgICAgICAgICogICAgIHdlIGNoZWNrIHRoYXQgdGhlIHByb3BlcnR5IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAqICAgICAKLSAgICAgICAgICogKDIpIHNlcnZlcmRlZiBwcm9wZXJ0aWVzIGNhbiBvdmVycmlkZSBydW50aW1lZGVmIHByb3BlcnRpZXMgICAgCi0gICAgICAgICAqLwotICAgICAgICBMaXN0IHByb3BlcnRpZXMgPSBydW50aW1lZGVmLmdldFByb3BlcnR5KCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlmTm90UHJlc2VudChzZXJ2ZXJkZWYuZ2V0UHJvcGVydHkoKSwgcHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQWRkIGNsYXNzcGF0aHMgZnJvbSBydW50aW1lZGVmIHRvIHNlcnZlcmRlZiBpZiBub3QgYWxyZWFkeSBwcmVzZW50LAotICAgICAgICAgKiB0aGlzIGVuc3VyZXMgdGhhdDoKLSAgICAgICAgICogCi0gICAgICAgICAqICgxKSB3aGlsZSB3ZSBhcmUgYWZmZWN0aW5nIHRoZSBjYWNoZWQgY29weSBvZiBzZXJ2ZXJkZWYsIGl0IGlzIGFsd2F5cwotICAgICAgICAgKiAgICAgcmVxdWlyZWQgdG8gYmUgY29tYmluZWQgd2l0aCBpdHMgcnVudGltZWRlZiAoaWYgdGhlcmUgaXMgb25lKSwgYW5kCi0gICAgICAgICAqICAgICB3ZSBjaGVjayB0aGF0IHRoZSBjbGFzc3BhdGggaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgKGJ5IGlkKQotICAgICAgICAgKiAgICAgCi0gICAgICAgICAqICgyKSBzZXJ2ZXJkZWYgY2xhc3NwYXRoIGNhbiBvdmVycmlkZSBydW50aW1lZGVmIGNsYXNzcGF0aCBieSBpZCAgICAKLSAgICAgICAgICovCi0gICAgICAgIExpc3QgY2xhc3NwYXRocyA9IHJ1bnRpbWVkZWYuZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGlmIChjbGFzc3BhdGhzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjbGFzc3BhdGhzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzc3BhdGggY2xhc3NwYXRoID0gKENsYXNzcGF0aClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRDbGFzc3BhdGhJZk5vdFByZXNlbnQoc2VydmVyZGVmLmdldENsYXNzcGF0aCgpLCBjbGFzc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2VydmVyZGVmOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2xhc3NwYXRoSWZOb3RQcmVzZW50KExpc3QgY2xhc3NwYXRocywgQ2xhc3NwYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBpZiAoIWNvbnRhaW5zQ2xhc3NwYXRoKGNsYXNzcGF0aHMsIGNsYXNzcGF0aC5nZXRJZCgpKSkgewotICAgICAgICAgICAgY2xhc3NwYXRocy5hZGQoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNDbGFzc3BhdGgoTGlzdCBwcm9wZXJ0aWVzLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENsYXNzcGF0aCBjbGFzc3BhdGggPSAoQ2xhc3NwYXRoKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGguZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3VuZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0eUlmTm90UHJlc2VudChMaXN0IHByb3BlcnRpZXMsIFByb3BlcnR5IHByb3ApIHsKLSAgICAgICAgaWYgKCFjb250YWluc1Byb3BlcnR5KHByb3BlcnRpZXMsIHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKHByb3ApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1Byb3BlcnR5KExpc3QgcHJvcGVydGllcywgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwcm9wLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvZmlsZXMvRGlyZWN0b3J5U2Nhbm5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2ZpbGVzL0RpcmVjdG9yeVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0NDZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvZmlsZXMvRGlyZWN0b3J5U2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBFdGVyYXRpb24gQS5TLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5maWxlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiAKLSAqIERFUklWRUQgRlJPTSBBUEFDSEUgQU5UIERJUkVDVE9SWSBTQ0FOTkVSCi0gKiAKLSAqIENsYXNzIGZvciBzY2FubmluZyBhIGRpcmVjdG9yeSBmb3IgZmlsZXMvZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2ggY2VydGFpbgotICogY3JpdGVyaWEuCi0gKiA8cD4KLSAqIFRoZXNlIGNyaXRlcmlhIGNvbnNpc3Qgb2Ygc2VsZWN0b3JzIGFuZCBwYXR0ZXJucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lmaWVkLgotICogV2l0aCB0aGUgc2VsZWN0b3JzIHlvdSBjYW4gc2VsZWN0IHdoaWNoIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQuCi0gKiBGaWxlcyB3aGljaCBhcmUgbm90IHNlbGVjdGVkIGFyZSBleGNsdWRlZC4gV2l0aCBwYXR0ZXJucyB5b3UgY2FuIGluY2x1ZGUKLSAqIG9yIGV4Y2x1ZGUgZmlsZXMgYmFzZWQgb24gdGhlaXIgZmlsZW5hbWUuCi0gKiA8cD4KLSAqIFRoZSBpZGVhIGlzIHNpbXBsZS4gQSBnaXZlbiBkaXJlY3RvcnkgaXMgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgYWxsIGZpbGVzCi0gKiBhbmQgZGlyZWN0b3JpZXMuIEVhY2ggZmlsZS9kaXJlY3RvcnkgaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgc2V0IG9mIHNlbGVjdG9ycywKLSAqIGluY2x1ZGluZyBzcGVjaWFsIHN1cHBvcnQgZm9yIG1hdGNoaW5nIGFnYWluc3QgZmlsZW5hbWVzIHdpdGggaW5jbHVkZSBhbmQKLSAqIGFuZCBleGNsdWRlIHBhdHRlcm5zLiBPbmx5IGZpbGVzL2RpcmVjdG9yaWVzIHdoaWNoIG1hdGNoIGF0IGxlYXN0IG9uZQotICogcGF0dGVybiBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJuIGxpc3Qgb3Igb3RoZXIgZmlsZSBzZWxlY3RvciwgYW5kIGRvbid0IG1hdGNoCi0gKiBhbnkgcGF0dGVybiBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJuIGxpc3Qgb3IgZmFpbCB0byBtYXRjaCBhZ2FpbnN0IGEgcmVxdWlyZWQKLSAqIHNlbGVjdG9yIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBsaXN0IG9mIGZpbGVzL2RpcmVjdG9yaWVzIGZvdW5kLgotICogPHA+Ci0gKiBXaGVuIG5vIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucyBpcyBzdXBwbGllZCwgIioqIiB3aWxsIGJlIHVzZWQsIHdoaWNoCi0gKiBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCBiZSBtYXRjaGVkLiBXaGVuIG5vIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucyBpcwotICogc3VwcGxpZWQsIGFuIGVtcHR5IGxpc3QgaXMgdXNlZCwgc3VjaCB0aGF0IG5vdGhpbmcgd2lsbCBiZSBleGNsdWRlZC4gV2hlbgotICogbm8gc2VsZWN0b3JzIGFyZSBzdXBwbGllZCwgbm9uZSBhcmUgYXBwbGllZC4KLSAqIDxwPgotICogVGhlIGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2hpbmcgaXMgZG9uZSBhcyBmb2xsb3dzOgotICogVGhlIG5hbWUgdG8gYmUgbWF0Y2hlZCBpcyBzcGxpdCB1cCBpbiBwYXRoIHNlZ21lbnRzLiBBIHBhdGggc2VnbWVudCBpcyB0aGUKLSAqIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb3IgZmlsZSwgd2hpY2ggaXMgYm91bmRlZCBieQotICogPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+ICgnLycgdW5kZXIgVU5JWCwgJ1wnIHVuZGVyIFdpbmRvd3MpLgotICogRm9yIGV4YW1wbGUsICJhYmMvZGVmL2doaS94eXouamF2YSIgaXMgc3BsaXQgdXAgaW4gdGhlIHNlZ21lbnRzICJhYmMiLAotICogImRlZiIsImdoaSIgYW5kICJ4eXouamF2YSIuCi0gKiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgcGF0dGVybiBhZ2FpbnN0IHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkLgotICogPHA+Ci0gKiBUaGUgc2VnbWVudHMgb2YgdGhlIG5hbWUgYW5kIHRoZSBwYXR0ZXJuIGFyZSB0aGVuIG1hdGNoZWQgYWdhaW5zdCBlYWNoCi0gKiBvdGhlci4gV2hlbiAnKionIGlzIHVzZWQgZm9yIGEgcGF0aCBzZWdtZW50IGluIHRoZSBwYXR0ZXJuLCBpdCBtYXRjaGVzCi0gKiB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBvZiB0aGUgbmFtZS4KLSAqIDxwPgotICogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+cwotICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0dGVybiBhbmQgdGhlIHN0cmluZyB0byBtYXRjaDo8YnI+Ci0gKiBXaGVuIGEgcGF0dGVybiBzdGFydHMgd2l0aCBhIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiwgdGhlIHN0cmluZwotICogdG8gbWF0Y2ggbXVzdCBhbHNvIHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCi0gKiBXaGVuIGEgcGF0dGVybiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LCB0aGUKLSAqIHN0cmluZyB0byBtYXRjaCBtYXkgbm90IHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCi0gKiBXaGVuIG9uZSBvZiB0aGVzZSBydWxlcyBpcyBub3Qgb2JleWVkLCB0aGUgc3RyaW5nIHdpbGwgbm90Ci0gKiBtYXRjaC4KLSAqIDxwPgotICogV2hlbiBhIG5hbWUgcGF0aCBzZWdtZW50IGlzIG1hdGNoZWQgYWdhaW5zdCBhIHBhdHRlcm4gcGF0aCBzZWdtZW50LCB0aGUKLSAqIGZvbGxvd2luZyBzcGVjaWFsIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQ6PGJyPgotICogJyonIG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+Ci0gKiAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLgotICogPHA+Ci0gKiBFeGFtcGxlczoKLSAqIDxwPgotICogIioqXCouY2xhc3MiIG1hdGNoZXMgYWxsIC5jbGFzcyBmaWxlcy9kaXJzIGluIGEgZGlyZWN0b3J5IHRyZWUuCi0gKiA8cD4KLSAqICJ0ZXN0XGE/Py5qYXZhIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggYW4gJ2EnLCB0aGVuIHR3bwotICogbW9yZSBjaGFyYWN0ZXJzIGFuZCB0aGVuICIuamF2YSIsIGluIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0LgotICogPHA+Ci0gKiAiKioiIG1hdGNoZXMgZXZlcnl0aGluZyBpbiBhIGRpcmVjdG9yeSB0cmVlLgotICogPHA+Ci0gKiAiKipcdGVzdFwqKlxYWVoqIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggIlhZWiIgYW5kIHdoZXJlCi0gKiB0aGVyZSBpcyBhIHBhcmVudCBkaXJlY3RvcnkgY2FsbGVkIHRlc3QgKGUuZy4gImFiY1x0ZXN0XGRlZlxnaGlcWFlaMTIzIikuCi0gKiA8cD4KLSAqIENhc2Ugc2Vuc2l0aXZpdHkgbWF5IGJlIHR1cm5lZCBvZmYgaWYgbmVjZXNzYXJ5LiBCeSBkZWZhdWx0LCBpdCBpcwotICogdHVybmVkIG9uLgotICogPHA+Ci0gKiBFeGFtcGxlIG9mIHVzYWdlOgotICogPHByZT4KLSAqICAgU3RyaW5nW10gaW5jbHVkZXMgPSB7IioqXFwqLmNsYXNzIn07Ci0gKiAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0geyJtb2R1bGVzXFwqXFwqKiJ9OwotICogICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gKiAgIGRzLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLSAqICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZSgidGVzdCIpKTsKLSAqICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZSh0cnVlKTsKLSAqICAgZHMuc2NhbigpOwotICoKLSAqICAgU3lzdGVtLm91dC5wcmludGxuKCJGSUxFUzoiKTsKLSAqICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gKiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZXNbaV0pOwotICogICB9Ci0gKiA8L3ByZT4KLSAqIFRoaXMgd2lsbCBzY2FuIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0IGZvciAuY2xhc3MgZmlsZXMsIGJ1dCBleGNsdWRlcyBhbGwKLSAqIGZpbGVzIGluIGFsbCBwcm9wZXIgc3ViZGlyZWN0b3JpZXMgb2YgYSBkaXJlY3RvcnkgY2FsbGVkICJtb2R1bGVzIgotICoKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVNjYW5uZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyIHsKLQkKLQlwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nW10gaW5jbHVkZXMpIHsKLQkJc3VwZXIuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKLQkJc3VwZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QmFzZWRpcihGaWxlIGRpcikgewotCQlzdXBlci5zZXRCYXNlZGlyKGRpcik7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBkaXIpIHsKLQkJc3VwZXIuc2V0QmFzZWRpcihkaXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNjYW4oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2NhbigpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ0YTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZXJ2ZXJUeXBlUGFja2FnZS5qYXZhLHYgMS44IDIwMDcvMDUvMTAgMDQ6NTA6NDcgbmRhaSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlclR5cGVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbCA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRBcmNoaXZlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEVfX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsIDxlbT5Bcmd1bWVudCBQYWlyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0QXJndW1lbnRQYWlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkdVTUVOVF9QQUlSX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bcmd1bWVudCBQYWlyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVJfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQ2xhc3NwYXRoSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJjaGl2ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19BUkNISVZFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWxlc2V0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU1BBVEhfX0ZJTEVTRVQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMQVNTUEFUSF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbCA8ZW0+RXhjbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRFeGNsdWRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWENMVURFX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX1RZUEVfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwgPGVtPkV4dGVybmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFUk5BTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFUk5BTF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfX09TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeHRlcm5hbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFUk5BTF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCA8ZW0+RmlsZXNldCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfX0lOQ0xVREUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTEVTRVRfVFlQRV9fRVhDTFVERSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzZXNlbnNpdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTEVTRVRfVFlQRV9fQ0FTRVNFTlNJVElWRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRVNFVF9UWVBFX19ESVIgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbGVzZXQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5JbmNsdWRlVHlwZUltcGwgPGVtPkluY2x1ZGUgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5JbmNsdWRlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0SW5jbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbmNsdWRlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KbmRpIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9DT05ORUNUSU9OX19JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsIDxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyYW0gQXJndW1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm0gUGFyYW1ldGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVidWcgUG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCA8ZW0+TW9kdWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLk1vZHVsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1PRFVMRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaCBEaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX1BVQkxJU0hfRElSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaXNoZXIgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0UG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT1JUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX19OTyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9fUFJPVE9DT0wgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPSkVDVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9QRVJUWSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQ09OVEVYVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19ERUZBVUxUID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTEFCRUwgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsIDxlbT5QdWJsaXNoZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQdWJsaXNoZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcmRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9fUFVCTElTSEVSREFUQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVUJMSVNIRVJfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwgPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckRhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEEgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YXZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHVibGlzaGVyIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCA8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fUFJPUEVSVFkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BPUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fTU9EVUxFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1NUQVJUID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1NUT1AgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fR1JPVVA0ID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fTkFNRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fVkVSU0lPTiA9IDE1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX0ZFQVRVUkVfQ09VTlQgPSAxNjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFyY2hpdmVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGgoKQotCSAqIEBzZWUgI2dldEFyY2hpdmVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmNoaXZlVHlwZV9QYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bcmd1bWVudCBQYWlyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFyZ3VtZW50UGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEFyZ3VtZW50UGFpcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJndW1lbnRQYWlyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0QXJndW1lbnRQYWlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmd1bWVudFBhaXJfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDbGFzc3BhdGhfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRBcmNoaXZlIDxlbT5BcmNoaXZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcmNoaXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0QXJjaGl2ZSgpCi0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDbGFzc3BhdGhfQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEZpbGVzZXQgPGVtPkZpbGVzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZpbGVzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRGaWxlc2V0KCkKLQkgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENsYXNzcGF0aF9GaWxlc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlIDxlbT5FeGNsdWRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhjbHVkZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RXhjbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4Y2x1ZGVUeXBlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwgPGVtPkV4dGVybmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVybmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbF9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldE9zIDxlbT5PczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcygpCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVybmFsX09zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlIDxlbT5GaWxlc2V0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmlsZXNldCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsZXNldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluY2x1ZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUoKQotCSAqIEBzZWUgI2dldEZpbGVzZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWxlc2V0VHlwZV9JbmNsdWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXRFeGNsdWRlIDxlbT5FeGNsdWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGNsdWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXRFeGNsdWRlKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsZXNldFR5cGVfRXhjbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSA8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2VzZW5zaXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjZ2V0RmlsZXNldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXREaXIgPGVtPkRpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfRGlyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlIDxlbT5JbmNsdWRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5jbHVkZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0SW5jbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEluY2x1ZGVUeXBlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsIDxlbT5Qcm92aWRlciBVcmw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsKCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEpuZGlQcm9wZXJ0eSA8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0Sm5kaVByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5IDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiA8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAxKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRQcm9ncmFtQXJndW1lbnRzIDxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0UHJvZ3JhbUFyZ3VtZW50cygpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFdvcmtpbmdEaXJlY3RvcnkoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0TWFpbkNsYXNzIDxlbT5NYWluIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRNYWluQ2xhc3MoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRWbVBhcmFtZXRlcnMgPGVtPlZtIFBhcmFtZXRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlZtIFBhcmFtZXRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Vm1QYXJhbWV0ZXJzKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWJ1ZyBQb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldERlYnVnUG9ydCgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZXJuYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RXh0ZXJuYWwoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaERpciA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaXNoIERpcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaGVyUmVmZXJlbmNlIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8oKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfTm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0UHJvdG9jb2wgPGVtPlByb3RvY29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdG9jb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0UHJvdG9jb2woKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfUHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0I2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0NvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0RGVmYXVsdCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0RlZmF1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhYmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRMYWJlbCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0xhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0UHVibGlzaGVyZGF0YSA8ZW0+UHVibGlzaGVyZGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHVibGlzaGVyZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldFB1Ymxpc2hlcmRhdGEoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHVibGlzaGVyX1B1Ymxpc2hlcmRhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSA8ZW0+UHVibGlzaGVyIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHVibGlzaGVyIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFB1Ymxpc2hlckRhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGFuYW1lIDxlbT5EYXRhbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGFuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGFuYW1lKCkKLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGF2YWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2ZXJSdW50aW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UG9ydCA8ZW0+UG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQb3J0KCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TW9kdWxlKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlN0b3A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0U3RvcCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQdWJsaXNoZXIgPGVtPlB1Ymxpc2hlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFB1Ymxpc2hlcigpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9QdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDQoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Sm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZlclR5cGVGYWN0b3J5IGdldFNlcnZlclR5cGVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5BcmNoaXZlVHlwZUltcGwgPGVtPkFyY2hpdmUgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5BcmNoaXZlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEFyY2hpdmVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSQ0hJVkVfVFlQRSA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSQ0hJVkVfVFlQRV9fUEFUSCA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlVHlwZV9QYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQXJndW1lbnRQYWlySW1wbCA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRBcmd1bWVudFBhaXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJHVU1FTlRfUEFJUiA9IGVJTlNUQU5DRS5nZXRBcmd1bWVudFBhaXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUkdVTUVOVF9QQUlSX19OQU1FID0gZUlOU1RBTkNFLmdldEFyZ3VtZW50UGFpcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSR1VNRU5UX1BBSVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwgPGVtPkNsYXNzcGF0aDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRDbGFzc3BhdGgoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0xBU1NQQVRIID0gZUlOU1RBTkNFLmdldENsYXNzcGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENMQVNTUEFUSF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcmNoaXZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDTEFTU1BBVEhfX0FSQ0hJVkUgPSBlSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGVzZXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENMQVNTUEFUSF9fRklMRVNFVCA9IGVJTlNUQU5DRS5nZXRDbGFzc3BhdGhfRmlsZXNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDTEFTU1BBVEhfX0lEID0gZUlOU1RBTkNFLmdldENsYXNzcGF0aF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbCA8ZW0+RXhjbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RXhjbHVkZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhDTFVERV9UWVBFID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhDTFVERV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVUeXBlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwgPGVtPkV4dGVybmFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RXh0ZXJuYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhURVJOQUwgPSBlSU5TVEFOQ0UuZ2V0RXh0ZXJuYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhURVJOQUxfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEV4dGVybmFsX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYVEVSTkFMX19PUyA9IGVJTlNUQU5DRS5nZXRFeHRlcm5hbF9PcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCA8ZW0+RmlsZXNldCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RmlsZXNldFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMRVNFVF9UWVBFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRVNFVF9UWVBFX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRGaWxlc2V0VHlwZV9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMRVNFVF9UWVBFX19JTkNMVURFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0luY2x1ZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTEVTRVRfVFlQRV9fRVhDTFVERSA9IGVJTlNUQU5DRS5nZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNlc2Vuc2l0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTEVTRVRfVFlQRV9fRElSID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0RpcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkluY2x1ZGVUeXBlSW1wbCA8ZW0+SW5jbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkluY2x1ZGVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0SW5jbHVkZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5DTFVERV9UWVBFID0gZUlOU1RBTkNFLmdldEluY2x1ZGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5DTFVERV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldEluY2x1ZGVUeXBlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwgPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEpuZGlDb25uZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpORElfQ09OTkVDVElPTiA9IGVJTlNUQU5DRS5nZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkwgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKTkRJX0NPTk5FQ1RJT05fX0dST1VQID0gZUlOU1RBTkNFLmdldEpuZGlDb25uZWN0aW9uX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KbmRpIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwgPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExBVU5DSF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgVmFyaWFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRSA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3JhbSBBcmd1bWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUyA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZtIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fVm1QYXJhbWV0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlYnVnIFBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVCA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0RlYnVnUG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsIDxlbT5Nb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1PRFVMRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2ggRGlyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19QVUJMSVNIX0RJUiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfUHVibGlzaERpcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyIFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVCA9IGVJTlNUQU5DRS5nZXRQb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ObzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfX05PID0gZUlOU1RBTkNFLmdldFBvcnRfTm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX19OQU1FID0gZUlOU1RBTkNFLmdldFBvcnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX19QUk9UT0NPTCA9IGVJTlNUQU5DRS5nZXRQb3J0X1Byb3RvY29sKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwgPGVtPlByb2plY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFByb2plY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19DT05URVhUID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X0NvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fREVGQVVMVCA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9EZWZhdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19JRCA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfTGFiZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbCA8ZW0+UHVibGlzaGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQVUJMSVNIRVIgPSBlSU5TVEFOQ0UuZ2V0UHVibGlzaGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFVCTElTSEVSX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJfR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcmRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBVQkxJU0hFUl9fUFVCTElTSEVSREFUQSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQVUJMSVNIRVJfX0lEID0gZUlOU1RBTkNFLmdldFB1Ymxpc2hlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckRhdGFJbXBsIDxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0UHVibGlzaGVyRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQVUJMSVNIRVJfREFUQSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhdmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFID0gZUlOU1RBTkNFLmdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZFUl9SVU5USU1FID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWRVJfUlVOVElNRV9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZFUl9SVU5USU1FX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19QT1JUID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWRVJfUlVOVElNRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX1NUQVJUID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfU3RhcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fU1RPUCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZFUl9SVU5USU1FX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0puZGlDb25uZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCk7Ci0KLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0FyY2hpdmVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0FyY2hpdmVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWY2ZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9BcmNoaXZlVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyY2hpdmUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbCNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcmNoaXZlVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXRoKCkgPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IFBBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQVJDSElWRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgbmV3UGF0aCkgewotCQlTdHJpbmcgb2xkUGF0aCA9IHBhdGg7Ci0JCXBhdGggPSBuZXdQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEgsIG9sZFBhdGgsIHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKFBBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEg6Ci0JCQkJcmV0dXJuIFBBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHBhdGggIT0gbnVsbCA6ICFQQVRIX0VERUZBVUxULmVxdWFscyhwYXRoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcmNoaXZlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQXJndW1lbnRQYWlySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFmZGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJndW1lbnQgUGFpcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJndW1lbnRQYWlySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXJndW1lbnRQYWlyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFyZ3VtZW50UGFpckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5BUkdVTUVOVF9QQUlSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bcmd1bWVudFBhaXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQ2xhc3NwYXRoSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0NsYXNzcGF0aEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmNmJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQ2xhc3NwYXRoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0QXJjaGl2ZSA8ZW0+QXJjaGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0RmlsZXNldCA8ZW0+RmlsZXNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2xhc3NwYXRoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzc3BhdGhJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NQQVRIOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5DTEFTU1BBVEhfX0FSQ0hJVkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlc2V0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkNMQVNTUEFUSF9fRklMRVNFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmNoaXZlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19GSUxFU0VUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXNldCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuIGdldEFyY2hpdmUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19GSUxFU0VUOgotCQkJCXJldHVybiBnZXRGaWxlc2V0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fQVJDSElWRToKLQkJCQlnZXRBcmNoaXZlKCkuY2xlYXIoKTsKLQkJCQlnZXRBcmNoaXZlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fRklMRVNFVDoKLQkJCQlnZXRGaWxlc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJZ2V0QXJjaGl2ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0ZJTEVTRVQ6Ci0JCQkJZ2V0RmlsZXNldCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuICFnZXRBcmNoaXZlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0ZJTEVTRVQ6Ci0JCQkJcmV0dXJuICFnZXRGaWxlc2V0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DbGFzc3BhdGhJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvRXhjbHVkZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvRXhjbHVkZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTBiMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4Y2x1ZGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjbHVkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRXhjbHVkZVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNsdWRlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4Y2x1ZGVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNsdWRlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5FWENMVURFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkVYQ0xVREVfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYQ0xVREVfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4Y2x1ZGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTNlODBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9FeHRlcm5hbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVybmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRXh0ZXJuYWxJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbCNnZXRPcyA8ZW0+T3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVybmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcygpIDxlbT5PczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9zKCkgPGVtPk9zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcyA9IE9TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVybmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkVYVEVSTkFMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9zKFN0cmluZyBuZXdPcykgewotCQlTdHJpbmcgb2xkT3MgPSBvczsKLQkJb3MgPSBuZXdPczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TLCBvbGRPcywgb3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TOgotCQkJCXJldHVybiBnZXRPcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19PUzoKLQkJCQlzZXRPcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TOgotCQkJCXNldE9zKE9TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fT1M6Ci0JCQkJcmV0dXJuIE9TX0VERUZBVUxUID09IG51bGwgPyBvcyAhPSBudWxsIDogIU9TX0VERUZBVUxULmVxdWFscyhvcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVybmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0ZpbGVzZXRUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0ZpbGVzZXRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDA3Yzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9GaWxlc2V0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlc2V0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRmlsZXNldFR5cGVJbXBsI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0RXhjbHVkZSA8ZW0+RXhjbHVkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0RGlyIDxlbT5EaXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc2V0VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbGVzZXRUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNlc2Vuc2l0aXZlKCkgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0VTRU5TSVRJVkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzZXNlbnNpdGl2ZSgpIDxlbT5DYXNlc2Vuc2l0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2VzZW5zaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBDQVNFU0VOU0lUSVZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYXNlc2Vuc2l0aXZlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXIoKSA8ZW0+RGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXIoKSA8ZW0+RGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlyID0gRElSX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZpbGVzZXRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkZJTEVTRVRfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluY2x1ZGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuRklMRVNFVF9UWVBFX19JTkNMVURFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhjbHVkZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5GSUxFU0VUX1RZUEVfX0VYQ0xVREUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzZXNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuIG5ld0Nhc2VzZW5zaXRpdmUpIHsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKLQkJY2FzZXNlbnNpdGl2ZSA9IG5ld0Nhc2VzZW5zaXRpdmU7Ci0JCWJvb2xlYW4gb2xkQ2FzZXNlbnNpdGl2ZUVTZXQgPSBjYXNlc2Vuc2l0aXZlRVNldDsKLQkJY2FzZXNlbnNpdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkUsIG9sZENhc2VzZW5zaXRpdmUsIGNhc2VzZW5zaXRpdmUsICFvbGRDYXNlc2Vuc2l0aXZlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FzZXNlbnNpdGl2ZSgpIHsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlRVNldCA9IGNhc2VzZW5zaXRpdmVFU2V0OwotCQljYXNlc2Vuc2l0aXZlID0gQ0FTRVNFTlNJVElWRV9FREVGQVVMVDsKLQkJY2FzZXNlbnNpdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkUsIG9sZENhc2VzZW5zaXRpdmUsIENBU0VTRU5TSVRJVkVfRURFRkFVTFQsIG9sZENhc2VzZW5zaXRpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDYXNlc2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBkaXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyKFN0cmluZyBuZXdEaXIpIHsKLQkJU3RyaW5nIG9sZERpciA9IGRpcjsKLQkJZGlyID0gbmV3RGlyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUiwgb2xkRGlyLCBkaXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fSU5DTFVERToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluY2x1ZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeGNsdWRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fSU5DTFVERToKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFOgotCQkJCXJldHVybiBpc0Nhc2VzZW5zaXRpdmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fRElSOgotCQkJCXJldHVybiBnZXREaXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19JTkNMVURFOgotCQkJCWdldEluY2x1ZGUoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19FWENMVURFOgotCQkJCWdldEV4Y2x1ZGUoKS5jbGVhcigpOwotCQkJCWdldEV4Y2x1ZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFOgotCQkJCXNldENhc2VzZW5zaXRpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlzZXREaXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0lOQ0xVREU6Ci0JCQkJZ2V0SW5jbHVkZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJZ2V0RXhjbHVkZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkU6Ci0JCQkJdW5zZXRDYXNlc2Vuc2l0aXZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlzZXREaXIoRElSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0lOQ0xVREU6Ci0JCQkJcmV0dXJuICFnZXRJbmNsdWRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuICFnZXRFeGNsdWRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkU6Ci0JCQkJcmV0dXJuIGlzU2V0Q2FzZXNlbnNpdGl2ZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlyZXR1cm4gRElSX0VERUZBVUxUID09IG51bGwgPyBkaXIgIT0gbnVsbCA6ICFESVJfRURFRkFVTFQuZXF1YWxzKGRpcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2VzZW5zaXRpdmU6ICIpOwotCQlpZiAoY2FzZXNlbnNpdGl2ZUVTZXQpIHJlc3VsdC5hcHBlbmQoY2FzZXNlbnNpdGl2ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRmlsZXNldFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvSW5jbHVkZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvSW5jbHVkZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjEzODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0luY2x1ZGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5jbHVkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSW5jbHVkZVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNsdWRlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluY2x1ZGVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbmNsdWRlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5JTkNMVURFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luY2x1ZGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0puZGlDb25uZWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0puZGlDb25uZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUyOGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9KbmRpQ29ubmVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KbmRpIENvbm5lY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkpuZGlDb25uZWN0aW9uSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0Sm5kaVByb3BlcnR5IDxlbT5KbmRpIFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSA8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKbmRpQ29ubmVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpuZGlDb25uZWN0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdmlkZXJVcmwoKSA8ZW0+UHJvdmlkZXIgVXJsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm92aWRlclVybCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3ZpZGVyVXJsKCkgPGVtPlByb3ZpZGVyIFVybDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdmlkZXJVcmwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJVcmwgPSBQUk9WSURFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpIDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxDb250ZXh0RmFjdG9yeSA9IElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpuZGlDb25uZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkpORElfQ09OTkVDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyVXJsKCkgewotCQlyZXR1cm4gcHJvdmlkZXJVcmw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXJVcmwoU3RyaW5nIG5ld1Byb3ZpZGVyVXJsKSB7Ci0JCVN0cmluZyBvbGRQcm92aWRlclVybCA9IHByb3ZpZGVyVXJsOwotCQlwcm92aWRlclVybCA9IG5ld1Byb3ZpZGVyVXJsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTCwgb2xkUHJvdmlkZXJVcmwsIHByb3ZpZGVyVXJsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKbmRpUHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuSk5ESV9DT05ORUNUSU9OX19KTkRJX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGluaXRpYWxDb250ZXh0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoU3RyaW5nIG5ld0luaXRpYWxDb250ZXh0RmFjdG9yeSkgewotCQlTdHJpbmcgb2xkSW5pdGlhbENvbnRleHRGYWN0b3J5ID0gaW5pdGlhbENvbnRleHRGYWN0b3J5OwotCQlpbml0aWFsQ29udGV4dEZhY3RvcnkgPSBuZXdJbml0aWFsQ29udGV4dEZhY3Rvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksIG9sZEluaXRpYWxDb250ZXh0RmFjdG9yeSwgaW5pdGlhbENvbnRleHRGYWN0b3J5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRKbmRpUHJvcGVydHkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMOgotCQkJCXJldHVybiBnZXRQcm92aWRlclVybCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWToKLQkJCQlyZXR1cm4gZ2V0Sm5kaVByb3BlcnR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMOgotCQkJCXNldFByb3ZpZGVyVXJsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWToKLQkJCQlnZXRKbmRpUHJvcGVydHkoKS5jbGVhcigpOwotCQkJCWdldEpuZGlQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZOgotCQkJCXNldEluaXRpYWxDb250ZXh0RmFjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTDoKLQkJCQlzZXRQcm92aWRlclVybChQUk9WSURFUl9VUkxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJZ2V0Sm5kaVByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkw6Ci0JCQkJcmV0dXJuIFBST1ZJREVSX1VSTF9FREVGQVVMVCA9PSBudWxsID8gcHJvdmlkZXJVcmwgIT0gbnVsbCA6ICFQUk9WSURFUl9VUkxfRURFRkFVTFQuZXF1YWxzKHByb3ZpZGVyVXJsKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICFnZXRKbmRpUHJvcGVydHkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJcmV0dXJuIElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBpbml0aWFsQ29udGV4dEZhY3RvcnkgIT0gbnVsbCA6ICFJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbENvbnRleHRGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByb3ZpZGVyVXJsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm92aWRlclVybCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsQ29udGV4dEZhY3Rvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxDb250ZXh0RmFjdG9yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0puZGlDb25uZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0xhdW5jaENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvTGF1bmNoQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2NmQ2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvTGF1bmNoQ29uZmlndXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGF1bmNoIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0UHJvZ3JhbUFyZ3VtZW50cyA8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldE1haW5DbGFzcyA8ZW0+TWFpbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0Vm1QYXJhbWV0ZXJzIDxlbT5WbSBQYXJhbWV0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0RGVidWdQb3J0IDxlbT5EZWJ1ZyBQb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRFeHRlcm5hbCA8ZW0+RXh0ZXJuYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTGF1bmNoQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluQ2xhc3MoKSA8ZW0+TWFpbiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5DbGFzcygpIDxlbT5NYWluIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkNsYXNzID0gTUFJTl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzcGF0aFJlZmVyZW5jZSA9IENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVidWdQb3J0KCkgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfUE9SVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWJ1Z1BvcnQoKSA8ZW0+RGVidWcgUG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVidWdQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlYnVnUG9ydCA9IERFQlVHX1BPUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExhdW5jaENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuTEFVTkNIX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudmlyb25tZW50VmFyaWFibGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9ncmFtQXJndW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHdvcmtpbmdEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgbmV3V29ya2luZ0RpcmVjdG9yeSkgewotCQlTdHJpbmcgb2xkV29ya2luZ0RpcmVjdG9yeSA9IHdvcmtpbmdEaXJlY3Rvcnk7Ci0JCXdvcmtpbmdEaXJlY3RvcnkgPSBuZXdXb3JraW5nRGlyZWN0b3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlksIG9sZFdvcmtpbmdEaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpIHsKLQkJcmV0dXJuIG1haW5DbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjbGVhbldoaXRlU3BhY2UoU3RyaW5nIHN0cmluZykKLQl7Ci0JCWlmKHN0cmluZz09bnVsbCkKLQkJCXJldHVybiBudWxsOwotICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJaWYoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFyc1tpXSkpCi0JCQkJY2hhcnNbaV09JyAnOwotCQl9Ci0JCXJldHVybiAobmV3IFN0cmluZyhjaGFycykpLnRyaW0oKTsKLQkJCi0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgbmV3TWFpbkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci0JCW1haW5DbGFzcyA9IG5ld01haW5DbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MsIG9sZE1haW5DbGFzcywgbWFpbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Vm1QYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyBuZXdDbGFzc3BhdGhSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZENsYXNzcGF0aFJlZmVyZW5jZSA9IGNsYXNzcGF0aFJlZmVyZW5jZTsKLQkJY2xhc3NwYXRoUmVmZXJlbmNlID0gbmV3Q2xhc3NwYXRoUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSwgb2xkQ2xhc3NwYXRoUmVmZXJlbmNlLCBjbGFzc3BhdGhSZWZlcmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnUG9ydCgpIHsKLQkJcmV0dXJuIGRlYnVnUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z1BvcnQoU3RyaW5nIG5ld0RlYnVnUG9ydCkgewotCQlTdHJpbmcgb2xkRGVidWdQb3J0ID0gZGVidWdQb3J0OwotCQlkZWJ1Z1BvcnQgPSBuZXdEZWJ1Z1BvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JULCBvbGREZWJ1Z1BvcnQsIGRlYnVnUG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVybmFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZXJuYWwoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50VmFyaWFibGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldE1haW5DbGFzcygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldFZtUGFyYW1ldGVycygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUOgotCQkJCXJldHVybiBnZXREZWJ1Z1BvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlnZXRQcm9ncmFtQXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9ncmFtQXJndW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWToKLQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1M6Ci0JCQkJc2V0TWFpbkNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUzoKLQkJCQlnZXRWbVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCWdldFZtUGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVDoKLQkJCQlzZXREZWJ1Z1BvcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQlnZXRFeHRlcm5hbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZXJuYWwoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFM6Ci0JCQkJZ2V0UHJvZ3JhbUFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJc2V0V29ya2luZ0RpcmVjdG9yeShXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fTUFJTl9DTEFTUzoKLQkJCQlzZXRNYWluQ2xhc3MoTUFJTl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUzoKLQkJCQlnZXRWbVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0U6Ci0JCQkJc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQ6Ci0JCQkJc2V0RGVidWdQb3J0KERFQlVHX1BPUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMOgotCQkJCWdldEV4dGVybmFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRToKLQkJCQlyZXR1cm4gIWdldEVudmlyb25tZW50VmFyaWFibGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuICFnZXRQcm9ncmFtQXJndW1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIFdPUktJTkdfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyB3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwgOiAhV09SS0lOR19ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKHdvcmtpbmdEaXJlY3RvcnkpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fTUFJTl9DTEFTUzoKLQkJCQlyZXR1cm4gTUFJTl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gbWFpbkNsYXNzICE9IG51bGwgOiAhTUFJTl9DTEFTU19FREVGQVVMVC5lcXVhbHMobWFpbkNsYXNzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTOgotCQkJCXJldHVybiAhZ2V0Vm1QYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NwYXRoUmVmZXJlbmNlICE9IG51bGwgOiAhQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NwYXRoUmVmZXJlbmNlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQ6Ci0JCQkJcmV0dXJuIERFQlVHX1BPUlRfRURFRkFVTFQgPT0gbnVsbCA/IGRlYnVnUG9ydCAhPSBudWxsIDogIURFQlVHX1BPUlRfRURFRkFVTFQuZXF1YWxzKGRlYnVnUG9ydCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUw6Ci0JCQkJcmV0dXJuICFnZXRFeHRlcm5hbCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtpbmdEaXJlY3Rvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1haW5DbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFpbkNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NwYXRoUmVmZXJlbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc3BhdGhSZWZlcmVuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlYnVnUG9ydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVidWdQb3J0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKSB7Ci0JCXJldHVybiBjb25jYXRMaXN0KGdldFByb2dyYW1Bcmd1bWVudHMoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWbVBhcmFtZXRlcnNBc1N0cmluZygpIHsKLQkJcmV0dXJuIGNvbmNhdExpc3QoZ2V0Vm1QYXJhbWV0ZXJzKCkpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotCXByaXZhdGUgU3RyaW5nIGNvbmNhdExpc3QoTGlzdCBsaXN0KXsKLQkJU3RyaW5nQnVmZmVyIGNvbmNhdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNhdFN0cmluZy50b1N0cmluZygpOwotCX0KLQkKLX0gLy9MYXVuY2hDb25maWd1cmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Nb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2MzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsI2dldFB1Ymxpc2hEaXIgPGVtPlB1Ymxpc2ggRGlyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hEaXIoKSA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRElSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hEaXIoKSA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGlzaERpciA9IFBVQkxJU0hfRElSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9SRUZFUkVOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaXNoZXJSZWZlcmVuY2UgPSBQVUJMSVNIRVJfUkVGRVJFTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5NT0RVTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hEaXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgbmV3UHVibGlzaERpcikgewotCQlTdHJpbmcgb2xkUHVibGlzaERpciA9IHB1Ymxpc2hEaXI7Ci0JCXB1Ymxpc2hEaXIgPSBuZXdQdWJsaXNoRGlyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hfRElSLCBvbGRQdWJsaXNoRGlyLCBwdWJsaXNoRGlyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVyUmVmZXJlbmNlKFN0cmluZyBuZXdQdWJsaXNoZXJSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZFB1Ymxpc2hlclJlZmVyZW5jZSA9IHB1Ymxpc2hlclJlZmVyZW5jZTsKLQkJcHVibGlzaGVyUmVmZXJlbmNlID0gbmV3UHVibGlzaGVyUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0UsIG9sZFB1Ymxpc2hlclJlZmVyZW5jZSwgcHVibGlzaGVyUmVmZXJlbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlyZXR1cm4gZ2V0UHVibGlzaERpcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hlclJlZmVyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlzZXRQdWJsaXNoRGlyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFOgotCQkJCXNldFB1Ymxpc2hlclJlZmVyZW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSF9ESVI6Ci0JCQkJc2V0UHVibGlzaERpcihQVUJMSVNIX0RJUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0U6Ci0JCQkJc2V0UHVibGlzaGVyUmVmZXJlbmNlKFBVQkxJU0hFUl9SRUZFUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlyZXR1cm4gUFVCTElTSF9ESVJfRURFRkFVTFQgPT0gbnVsbCA/IHB1Ymxpc2hEaXIgIT0gbnVsbCA6ICFQVUJMSVNIX0RJUl9FREVGQVVMVC5lcXVhbHMocHVibGlzaERpcik7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gcHVibGlzaGVyUmVmZXJlbmNlICE9IG51bGwgOiAhUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hEaXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1Ymxpc2hEaXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hlclJlZmVyZW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTW9kdWxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1BvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYTYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlBvcnRJbXBsI2dldE5vIDxlbT5ObzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlBvcnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qb3J0SW1wbCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vKCkgPGVtPk5vPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRObygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm8oKSA8ZW0+Tm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vID0gTk9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm90b2NvbCgpIDxlbT5Qcm90b2NvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sKCkgPGVtPlByb3RvY29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9IFBST1RPQ09MX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUE9SVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vKCkgewotCQlyZXR1cm4gbm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm8oU3RyaW5nIG5ld05vKSB7Ci0JCVN0cmluZyBvbGRObyA9IG5vOwotCQlubyA9IG5ld05vOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTywgb2xkTm8sIG5vKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlyZXR1cm4gcHJvdG9jb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIG5ld1Byb3RvY29sKSB7Ci0JCVN0cmluZyBvbGRQcm90b2NvbCA9IHByb3RvY29sOwotCQlwcm90b2NvbCA9IG5ld1Byb3RvY29sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTCwgb2xkUHJvdG9jb2wsIHByb3RvY29sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTzoKLQkJCQlyZXR1cm4gZ2V0Tm8oKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTDoKLQkJCQlyZXR1cm4gZ2V0UHJvdG9jb2woKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTzoKLQkJCQlzZXRObygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXNldFByb3RvY29sKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05POgotCQkJCXNldE5vKE5PX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXNldFByb3RvY29sKFBST1RPQ09MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTk86Ci0JCQkJcmV0dXJuIE5PX0VERUZBVUxUID09IG51bGwgPyBubyAhPSBudWxsIDogIU5PX0VERUZBVUxULmVxdWFscyhubyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fUFJPVE9DT0w6Ci0JCQkJcmV0dXJuIFBST1RPQ09MX0VERUZBVUxUID09IG51bGwgPyBwcm90b2NvbCAhPSBudWxsIDogIVBST1RPQ09MX0VERUZBVUxULmVxdWFscyhwcm90b2NvbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChubzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm90b2NvbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxYTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb2plY3QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NwYXRoUmVmZXJlbmNlID0gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBST0pFQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyBuZXdDbGFzc3BhdGhSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZENsYXNzcGF0aFJlZmVyZW5jZSA9IGNsYXNzcGF0aFJlZmVyZW5jZTsKLQkJY2xhc3NwYXRoUmVmZXJlbmNlID0gbmV3Q2xhc3NwYXRoUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFLCBvbGRDbGFzc3BhdGhSZWZlcmVuY2UsIGNsYXNzcGF0aFJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST0pFQ1RfX0NMQVNTUEFUSF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzcGF0aFJlZmVyZW5jZSAhPSBudWxsIDogIUNMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQuZXF1YWxzKGNsYXNzcGF0aFJlZmVyZW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbGFzc3BhdGhSZWZlcmVuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzcGF0aFJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2plY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTM5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsI2dldENvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGV4dCgpIDxlbT5Db250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHQoKSA8ZW0+Q29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0ID0gQ09OVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRfID0gREVGQVVMVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFiZWwoKSA8ZW0+TGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RyaW5nIG5ld0NvbnRleHQpIHsKLQkJU3RyaW5nIG9sZENvbnRleHQgPSBjb250ZXh0OwotCQljb250ZXh0ID0gbmV3Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQsIG9sZENvbnRleHQsIGNvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0XzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuZXdEZWZhdWx0KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0ID0gZGVmYXVsdF87Ci0JCWRlZmF1bHRfID0gbmV3RGVmYXVsdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQsIG9sZERlZmF1bHQsIGRlZmF1bHRfKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJaWYobGFiZWwuc3RhcnRzV2l0aCgiJSIsMCkpCi0JCXsKLQkJCVNlcnZlclJ1bnRpbWUgcnQgPSAoU2VydmVyUnVudGltZSllUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCUJ1bmRsZSBidW5kbGUgPVBsYXRmb3JtLmdldEJ1bmRsZShydC5nZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpKTsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhidW5kbGUsbGFiZWwpOwotCQl9Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbmV3TGFiZWwpIHsKLQkJU3RyaW5nIG9sZExhYmVsID0gbGFiZWw7Ci0JCWxhYmVsID0gbmV3TGFiZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTCwgb2xkTGFiZWwsIGxhYmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGV4dCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fREVGQVVMVDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTDoKLQkJCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVDoKLQkJCQlzZXRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTDoKLQkJCQlzZXRMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQ6Ci0JCQkJc2V0Q29udGV4dChDT05URVhUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoREVGQVVMVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0xBQkVMOgotCQkJCXNldExhYmVsKExBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19DT05URVhUOgotCQkJCXJldHVybiBDT05URVhUX0VERUZBVUxUID09IG51bGwgPyBjb250ZXh0ICE9IG51bGwgOiAhQ09OVEVYVF9FREVGQVVMVC5lcXVhbHMoY29udGV4dCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fTEFCRUw6Ci0JCQkJcmV0dXJuIExBQkVMX0VERUZBVUxUID09IG51bGwgPyBsYWJlbCAhPSBudWxsIDogIUxBQkVMX0VERUZBVUxULmVxdWFscyhsYWJlbCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYWJlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFiZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjdhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlB1Ymxpc2hlciBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJEYXRhSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHVibGlzaGVyRGF0YSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFuYW1lKCkgPGVtPkRhdGFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YW5hbWUoKSA8ZW0+RGF0YW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFuYW1lID0gREFUQU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGF2YWx1ZSA9IERBVEFWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQdWJsaXNoZXJEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBVQkxJU0hFUl9EQVRBOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YW5hbWUoKSB7Ci0JCXJldHVybiBkYXRhbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhbmFtZShTdHJpbmcgbmV3RGF0YW5hbWUpIHsKLQkJU3RyaW5nIG9sZERhdGFuYW1lID0gZGF0YW5hbWU7Ci0JCWRhdGFuYW1lID0gbmV3RGF0YW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSwgb2xkRGF0YW5hbWUsIGRhdGFuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhdmFsdWUoKSB7Ci0JCXJldHVybiBkYXRhdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YXZhbHVlKFN0cmluZyBuZXdEYXRhdmFsdWUpIHsKLQkJU3RyaW5nIG9sZERhdGF2YWx1ZSA9IGRhdGF2YWx1ZTsKLQkJZGF0YXZhbHVlID0gbmV3RGF0YXZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFLCBvbGREYXRhdmFsdWUsIGRhdGF2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXJldHVybiBnZXREYXRhbmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXJldHVybiBnZXREYXRhdmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQU5BTUU6Ci0JCQkJc2V0RGF0YW5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXNldERhdGF2YWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQU5BTUU6Ci0JCQkJc2V0RGF0YW5hbWUoREFUQU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRToKLQkJCQlzZXREYXRhdmFsdWUoREFUQVZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXJldHVybiBEQVRBTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YW5hbWUgIT0gbnVsbCA6ICFEQVRBTkFNRV9FREVGQVVMVC5lcXVhbHMoZGF0YW5hbWUpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXJldHVybiBEQVRBVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGF2YWx1ZSAhPSBudWxsIDogIURBVEFWQUxVRV9FREVGQVVMVC5lcXVhbHMoZGF0YXZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGFuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXRhbmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGF0YXZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXRhdmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QdWJsaXNoZXJEYXRhSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzQwM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsI2dldFB1Ymxpc2hlcmRhdGEgPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFB1Ymxpc2hlciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHVibGlzaGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBVQkxJU0hFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFB1Ymxpc2hlcmRhdGEoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fUFVCTElTSEVSREFUQToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcmRhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBOgotCQkJCXJldHVybiBnZXRQdWJsaXNoZXJkYXRhKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fUFVCTElTSEVSREFUQToKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJZ2V0UHVibGlzaGVyZGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJcmV0dXJuICFnZXRQdWJsaXNoZXJkYXRhKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QdWJsaXNoZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyUnVudGltZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZThiODFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbC5SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmVyIFJ1bnRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFBvcnQgPGVtPlBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2ZXJSdW50aW1lIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3QoKSA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIExhdW5jaENvbmZpZ3VyYXRpb24gc3RhcnQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMYXVuY2hDb25maWd1cmF0aW9uIHN0b3A7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpuZGlDb25uZWN0aW9uKCkgPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKbmRpQ29ubmVjdGlvbiBqbmRpQ29ubmVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvbHZlciByZXNvbHZlciA9IG5ldyBSZXNvbHZlcih0aGlzKTsKLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBpZCA9bnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQb3J0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fUE9SVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fTU9EVUxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQcm9qZWN0IG9sZFByb2plY3QgPSBwcm9qZWN0OwotCQlwcm9qZWN0ID0gbmV3UHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QsIG9sZFByb2plY3QsIG5ld1Byb2plY3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCWlmIChuZXdQcm9qZWN0ICE9IHByb2plY3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvamVjdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcm9qZWN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Byb2plY3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcm9qZWN0KG5ld1Byb2plY3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QsIG5ld1Byb2plY3QsIG5ld1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0YXJ0KExhdW5jaENvbmZpZ3VyYXRpb24gbmV3U3RhcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTGF1bmNoQ29uZmlndXJhdGlvbiBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQsIG9sZFN0YXJ0LCBuZXdTdGFydCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTGF1bmNoQ29uZmlndXJhdGlvbiBuZXdTdGFydCkgewotCQlpZiAobmV3U3RhcnQgIT0gc3RhcnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0YXJ0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0YXJ0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdGFydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdGFydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdGFydChuZXdTdGFydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQsIG5ld1N0YXJ0LCBuZXdTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXVuY2hDb25maWd1cmF0aW9uIGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0b3AoTGF1bmNoQ29uZmlndXJhdGlvbiBuZXdTdG9wLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUxhdW5jaENvbmZpZ3VyYXRpb24gb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUCwgb2xkU3RvcCwgbmV3U3RvcCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uIG5ld1N0b3ApIHsKLQkJaWYgKG5ld1N0b3AgIT0gc3RvcCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RvcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdG9wKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUT1AsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0b3AgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RvcCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0b3AobmV3U3RvcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUCwgbmV3U3RvcCwgbmV3U3RvcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFB1Ymxpc2hlcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXA0KCkgewotCQlpZiAoZ3JvdXA0ID09IG51bGwpIHsKLQkJCWdyb3VwNCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwNDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm5kaUNvbm5lY3Rpb24gZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBqbmRpQ29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBuZXdKbmRpQ29ubmVjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKbmRpQ29ubmVjdGlvbiBvbGRKbmRpQ29ubmVjdGlvbiA9IGpuZGlDb25uZWN0aW9uOwotCQlqbmRpQ29ubmVjdGlvbiA9IG5ld0puZGlDb25uZWN0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBvbGRKbmRpQ29ubmVjdGlvbiwgbmV3Sm5kaUNvbm5lY3Rpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIG5ld0puZGlDb25uZWN0aW9uKSB7Ci0JCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBqbmRpQ29ubmVjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam5kaUNvbm5lY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpam5kaUNvbm5lY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKbmRpQ29ubmVjdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm5kaUNvbm5lY3Rpb24obmV3Sm5kaUNvbm5lY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiwgbmV3Sm5kaUNvbm5lY3Rpb24sIG5ld0puZGlDb25uZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QT1JUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9ydCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTU9EVUxFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TW9kdWxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJUOgotCQkJCXJldHVybiBiYXNpY1NldFN0YXJ0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdG9wKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q2xhc3NwYXRoKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BPUlQ6Ci0JCQkJcmV0dXJuIGdldFBvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19NT0RVTEU6Ci0JCQkJcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QOgotCQkJCXJldHVybiBnZXRTdG9wKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSOgotCQkJCXJldHVybiBnZXRQdWJsaXNoZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJcmV0dXJuIGdldENsYXNzcGF0aCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OOgotCQkJCXJldHVybiBnZXRKbmRpQ29ubmVjdGlvbigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlnZXRNb2R1bGUoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoTGF1bmNoQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDM6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCWdldFB1Ymxpc2hlcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA0OgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJZ2V0Q2xhc3NwYXRoKCkuY2xlYXIoKTsKLQkJCQlnZXRDbGFzc3BhdGgoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19NT0RVTEU6Ci0JCQkJZ2V0TW9kdWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKExhdW5jaENvbmZpZ3VyYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSDoKLQkJCQlnZXRDbGFzc3BhdGgoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlyZXR1cm4gIWdldFByb3BlcnR5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BPUlQ6Ci0JCQkJcmV0dXJuICFnZXRQb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlyZXR1cm4gIWdldE1vZHVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIHByb2plY3QgIT0gbnVsbDsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJUOgotCQkJCXJldHVybiBzdGFydCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlyZXR1cm4gc3RvcCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlyZXR1cm4gIWdldFB1Ymxpc2hlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlyZXR1cm4gZ3JvdXA0ICE9IG51bGwgJiYgIWdyb3VwNC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJcmV0dXJuICFnZXRDbGFzc3BhdGgoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT046Ci0JCQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uICE9IG51bGw7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXIgZ2V0UHVibGlzaGVyKFN0cmluZyBpZCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2V0UHVibGlzaGVyKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlkLmVxdWFscyhwdWJsaXNoZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHB1Ymxpc2hlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHR5cGUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmdldE1vZHVsZSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih0eXBlLmVxdWFscyhtb2R1bGUuZ2V0VHlwZSgpKSkKLQkJCQlyZXR1cm4gbW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoIGdldENsYXNzcGF0aChTdHJpbmcgcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDbGFzc3BhdGggY3AgPSAoQ2xhc3NwYXRoKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihyZWYuZXF1YWxzKGNwLmdldElkKCkpKQotCQkJCXJldHVybiBjcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZm4pIHsKLQkJdGhpcy5maWxlbmFtZSA9IGZuOwkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucmVzb2x2ZXIuc2V0UHJvcGVydHlWYWx1ZXMocHJvcGVydGllcyk7Ci0JCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlcjsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0RGVjbGFyaW5nQnVuZGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKCkgewotICAgICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI3NldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmRlY2xhcmluZ0NvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlPW5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgCi0gICAgfQotCQotCQotfSAvL1NlcnZlclJ1bnRpbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzZiZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1NlcnZlclR5cGVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU2VydmVyVHlwZUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclR5cGVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJUeXBlRmFjdG9yeSB0aGVTZXJ2ZXJUeXBlRmFjdG9yeSA9IChTZXJ2ZXJUeXBlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIpOyAKLQkJCWlmICh0aGVTZXJ2ZXJUeXBlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVNlcnZlclR5cGVGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNlcnZlclR5cGVGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEU6IHJldHVybiBjcmVhdGVBcmNoaXZlVHlwZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSOiByZXR1cm4gY3JlYXRlQXJndW1lbnRQYWlyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSDogcmV0dXJuIGNyZWF0ZUNsYXNzcGF0aCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWENMVURFX1RZUEU6IHJldHVybiBjcmVhdGVFeGNsdWRlVHlwZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTDogcmV0dXJuIGNyZWF0ZUV4dGVybmFsKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRTogcmV0dXJuIGNyZWF0ZUZpbGVzZXRUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRTogcmV0dXJuIGNyZWF0ZUluY2x1ZGVUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTjogcmV0dXJuIGNyZWF0ZUpuZGlDb25uZWN0aW9uKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OOiByZXR1cm4gY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEU6IHJldHVybiBjcmVhdGVNb2R1bGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVDogcmV0dXJuIGNyZWF0ZVBvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVDogcmV0dXJuIGNyZWF0ZVByb2plY3QoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFk6IHJldHVybiBjcmVhdGVQcm9wZXJ0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVI6IHJldHVybiBjcmVhdGVQdWJsaXNoZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEE6IHJldHVybiBjcmVhdGVQdWJsaXNoZXJEYXRhKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FOiByZXR1cm4gY3JlYXRlU2VydmVyUnVudGltZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFyY2hpdmVUeXBlIGNyZWF0ZUFyY2hpdmVUeXBlKCkgewotCQlBcmNoaXZlVHlwZUltcGwgYXJjaGl2ZVR5cGUgPSBuZXcgQXJjaGl2ZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcmNoaXZlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJndW1lbnRQYWlyIGNyZWF0ZUFyZ3VtZW50UGFpcigpIHsKLQkJQXJndW1lbnRQYWlySW1wbCBhcmd1bWVudFBhaXIgPSBuZXcgQXJndW1lbnRQYWlySW1wbCgpOwotCQlyZXR1cm4gYXJndW1lbnRQYWlyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotCQlDbGFzc3BhdGhJbXBsIGNsYXNzcGF0aCA9IG5ldyBDbGFzc3BhdGhJbXBsKCk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2x1ZGVUeXBlIGNyZWF0ZUV4Y2x1ZGVUeXBlKCkgewotCQlFeGNsdWRlVHlwZUltcGwgZXhjbHVkZVR5cGUgPSBuZXcgRXhjbHVkZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBleGNsdWRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWwgY3JlYXRlRXh0ZXJuYWwoKSB7Ci0JCUV4dGVybmFsSW1wbCBleHRlcm5hbCA9IG5ldyBFeHRlcm5hbEltcGwoKTsKLQkJcmV0dXJuIGV4dGVybmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWxlc2V0VHlwZSBjcmVhdGVGaWxlc2V0VHlwZSgpIHsKLQkJRmlsZXNldFR5cGVJbXBsIGZpbGVzZXRUeXBlID0gbmV3IEZpbGVzZXRUeXBlSW1wbCgpOwotCQlyZXR1cm4gZmlsZXNldFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluY2x1ZGVUeXBlIGNyZWF0ZUluY2x1ZGVUeXBlKCkgewotCQlJbmNsdWRlVHlwZUltcGwgaW5jbHVkZVR5cGUgPSBuZXcgSW5jbHVkZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBpbmNsdWRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm5kaUNvbm5lY3Rpb24gY3JlYXRlSm5kaUNvbm5lY3Rpb24oKSB7Ci0JCUpuZGlDb25uZWN0aW9uSW1wbCBqbmRpQ29ubmVjdGlvbiA9IG5ldyBKbmRpQ29ubmVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0JCUxhdW5jaENvbmZpZ3VyYXRpb25JbXBsIGxhdW5jaENvbmZpZ3VyYXRpb24gPSBuZXcgTGF1bmNoQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxhdW5jaENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZHVsZSBjcmVhdGVNb2R1bGUoKSB7Ci0JCU1vZHVsZUltcGwgbW9kdWxlID0gbmV3IE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkgewotCQlQb3J0SW1wbCBwb3J0ID0gbmV3IFBvcnRJbXBsKCk7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCkgewotCQlQcm9wZXJ0eUltcGwgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyIGNyZWF0ZVB1Ymxpc2hlcigpIHsKLQkJUHVibGlzaGVySW1wbCBwdWJsaXNoZXIgPSBuZXcgUHVibGlzaGVySW1wbCgpOwotCQlyZXR1cm4gcHVibGlzaGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJEYXRhIGNyZWF0ZVB1Ymxpc2hlckRhdGEoKSB7Ci0JCVB1Ymxpc2hlckRhdGFJbXBsIHB1Ymxpc2hlckRhdGEgPSBuZXcgUHVibGlzaGVyRGF0YUltcGwoKTsKLQkJcmV0dXJuIHB1Ymxpc2hlckRhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWUgY3JlYXRlU2VydmVyUnVudGltZSgpIHsKLQkJU2VydmVyUnVudGltZUltcGwgc2VydmVyUnVudGltZSA9IG5ldyBTZXJ2ZXJSdW50aW1lSW1wbCgpOwotCQlyZXR1cm4gc2VydmVyUnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVBhY2thZ2UgZ2V0U2VydmVyVHlwZVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoU2VydmVyVHlwZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJUeXBlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJUeXBlUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4MzEyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNlcnZlclR5cGVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmNoaXZlVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmd1bWVudFBhaXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2xhc3NwYXRoRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2x1ZGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVybmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbGVzZXRUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluY2x1ZGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpuZGlDb25uZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdWJsaXNoZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHVibGlzaGVyRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2ZXJSdW50aW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlcnZlclR5cGVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgU2VydmVyVHlwZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFNlcnZlclR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcnZlclR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJU2VydmVyVHlwZVBhY2thZ2VJbXBsIHRoZVNlcnZlclR5cGVQYWNrYWdlID0gKFNlcnZlclR5cGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXJ2ZXJUeXBlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBTZXJ2ZXJUeXBlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlU2VydmVyVHlwZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVTZXJ2ZXJUeXBlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVTZXJ2ZXJUeXBlUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlU2VydmVyVHlwZVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcmNoaXZlVHlwZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyY2hpdmVUeXBlX1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcmNoaXZlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJndW1lbnRQYWlyKCkgewotCQlyZXR1cm4gYXJndW1lbnRQYWlyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyZ3VtZW50UGFpcl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJndW1lbnRQYWlyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJndW1lbnRQYWlyX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJndW1lbnRQYWlyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbGFzc3BhdGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDbGFzc3BhdGhfRmlsZXNldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNsYXNzcGF0aEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENsYXNzcGF0aF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNsYXNzcGF0aEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhjbHVkZVR5cGUoKSB7Ci0JCXJldHVybiBleGNsdWRlVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNsdWRlVHlwZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhjbHVkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVybmFsKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZXJuYWxfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlcm5hbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVybmFsX09zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXh0ZXJuYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbGVzZXRUeXBlKCkgewotCQlyZXR1cm4gZmlsZXNldFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVzZXRUeXBlX0luY2x1ZGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVzZXRUeXBlX0V4Y2x1ZGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0RpcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVzZXRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmNsdWRlVHlwZSgpIHsKLQkJcmV0dXJuIGluY2x1ZGVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluY2x1ZGVUeXBlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbmNsdWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBqbmRpQ29ubmVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqbmRpQ29ubmVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1dvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3J0KCkgewotCQlyZXR1cm4gcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05vKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X1Byb3RvY29sKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0NvbnRleHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0RlZmF1bHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9MYWJlbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQdWJsaXNoZXIoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHVibGlzaGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHVibGlzaGVyX1B1Ymxpc2hlcmRhdGEoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFB1Ymxpc2hlckRhdGEoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YW5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2ZXJSdW50aW1lKCkgewotCQlyZXR1cm4gc2VydmVyUnVudGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfTW9kdWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0puZGlDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVGYWN0b3J5IGdldFNlcnZlclR5cGVGYWN0b3J5KCkgewotCQlyZXR1cm4gKFNlcnZlclR5cGVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFyY2hpdmVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSQ0hJVkVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJjaGl2ZVR5cGVFQ2xhc3MsIEFSQ0hJVkVfVFlQRV9fUEFUSCk7Ci0KLQkJYXJndW1lbnRQYWlyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSR1VNRU5UX1BBSVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGFyZ3VtZW50UGFpckVDbGFzcywgQVJHVU1FTlRfUEFJUl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJndW1lbnRQYWlyRUNsYXNzLCBBUkdVTUVOVF9QQUlSX19WQUxVRSk7Ci0KLQkJY2xhc3NwYXRoRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2xhc3NwYXRoRUNsYXNzLCBDTEFTU1BBVEhfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fQVJDSElWRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY2xhc3NwYXRoRUNsYXNzLCBDTEFTU1BBVEhfX0ZJTEVTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNsYXNzcGF0aEVDbGFzcywgQ0xBU1NQQVRIX19JRCk7Ci0KLQkJZXhjbHVkZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhDTFVERV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleGNsdWRlVHlwZUVDbGFzcywgRVhDTFVERV9UWVBFX19OQU1FKTsKLQotCQlleHRlcm5hbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWFRFUk5BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZXJuYWxFQ2xhc3MsIEVYVEVSTkFMX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZXJuYWxFQ2xhc3MsIEVYVEVSTkFMX19PUyk7Ci0KLQkJZmlsZXNldFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMRVNFVF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlc2V0VHlwZUVDbGFzcywgRklMRVNFVF9UWVBFX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fSU5DTFVERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fRVhDTFVERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fQ0FTRVNFTlNJVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fRElSKTsKLQotCQlpbmNsdWRlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTkNMVURFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluY2x1ZGVUeXBlRUNsYXNzLCBJTkNMVURFX1RZUEVfX05BTUUpOwotCi0JCWpuZGlDb25uZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpORElfQ09OTkVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqbmRpQ29ubmVjdGlvbkVDbGFzcywgSk5ESV9DT05ORUNUSU9OX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOwotCi0JCWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTEFVTkNIX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTCk7Ci0KLQkJbW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19QVUJMSVNIX0RJUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0UpOwotCi0JCXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydEVDbGFzcywgUE9SVF9fTk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX1BST1RPQ09MKTsKLQotCQlwcm9qZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0pFQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2plY3RFQ2xhc3MsIFBST0pFQ1RfX0NMQVNTUEFUSF9SRUZFUkVOQ0UpOwotCi0JCXByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fREVGQVVMVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19MQUJFTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19UWVBFKTsKLQotCQlwdWJsaXNoZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFVCTElTSEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdWJsaXNoZXJFQ2xhc3MsIFBVQkxJU0hFUl9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHB1Ymxpc2hlckVDbGFzcywgUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdWJsaXNoZXJFQ2xhc3MsIFBVQkxJU0hFUl9fSUQpOwotCi0JCXB1Ymxpc2hlckRhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFVCTElTSEVSX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRGF0YUVDbGFzcywgUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRSk7Ci0KLQkJc2VydmVyUnVudGltZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWRVJfUlVOVElNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUDEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19QT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fTU9EVUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUFJPSkVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1NUQVJUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fU1RPUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQNCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19WRVJTSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXJjaGl2ZVR5cGVFQ2xhc3MsIEFyY2hpdmVUeXBlLmNsYXNzLCAiQXJjaGl2ZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXRoIiwgbnVsbCwgMCwgMSwgQXJjaGl2ZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJndW1lbnRQYWlyRUNsYXNzLCBBcmd1bWVudFBhaXIuY2xhc3MsICJBcmd1bWVudFBhaXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIEFyZ3VtZW50UGFpci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgQXJndW1lbnRQYWlyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNsYXNzcGF0aEVDbGFzcywgQ2xhc3NwYXRoLmNsYXNzLCAiQ2xhc3NwYXRoIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDbGFzc3BhdGhfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIENsYXNzcGF0aC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIHRoaXMuZ2V0QXJjaGl2ZVR5cGUoKSwgbnVsbCwgImFyY2hpdmUiLCBudWxsLCAwLCAtMSwgQ2xhc3NwYXRoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDbGFzc3BhdGhfRmlsZXNldCgpLCB0aGlzLmdldEZpbGVzZXRUeXBlKCksIG51bGwsICJmaWxlc2V0IiwgbnVsbCwgMCwgLTEsIENsYXNzcGF0aC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2xhc3NwYXRoX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBDbGFzc3BhdGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjbHVkZVR5cGVFQ2xhc3MsIEV4Y2x1ZGVUeXBlLmNsYXNzLCAiRXhjbHVkZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVUeXBlX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRXhjbHVkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXh0ZXJuYWxFQ2xhc3MsIEV4dGVybmFsLmNsYXNzLCAiRXh0ZXJuYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4dGVybmFsX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBFeHRlcm5hbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4dGVybmFsX09zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3MiLCBudWxsLCAwLCAxLCBFeHRlcm5hbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhmaWxlc2V0VHlwZUVDbGFzcywgRmlsZXNldFR5cGUuY2xhc3MsICJGaWxlc2V0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZXNldFR5cGVfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEZpbGVzZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZXNldFR5cGVfSW5jbHVkZSgpLCB0aGlzLmdldEluY2x1ZGVUeXBlKCksIG51bGwsICJpbmNsdWRlIiwgbnVsbCwgMCwgLTEsIEZpbGVzZXRUeXBlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCksIHRoaXMuZ2V0RXhjbHVkZVR5cGUoKSwgbnVsbCwgImV4Y2x1ZGUiLCBudWxsLCAwLCAtMSwgRmlsZXNldFR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzZXNlbnNpdGl2ZSIsIG51bGwsIDAsIDEsIEZpbGVzZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlc2V0VHlwZV9EaXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXIiLCBudWxsLCAwLCAxLCBGaWxlc2V0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbmNsdWRlVHlwZUVDbGFzcywgSW5jbHVkZVR5cGUuY2xhc3MsICJJbmNsdWRlVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5jbHVkZVR5cGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBJbmNsdWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqbmRpQ29ubmVjdGlvbkVDbGFzcywgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICJKbmRpQ29ubmVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm92aWRlclVybCIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCksIHRoaXMuZ2V0QXJndW1lbnRQYWlyKCksIG51bGwsICJqbmRpUHJvcGVydHkiLCBudWxsLCAwLCAtMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluaXRpYWxDb250ZXh0RmFjdG9yeSIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICJMYXVuY2hDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCksIHRoaXMuZ2V0QXJndW1lbnRQYWlyKCksIG51bGwsICJlbnZpcm9ubWVudFZhcmlhYmxlIiwgbnVsbCwgMCwgLTEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2dyYW1Bcmd1bWVudHMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtpbmdEaXJlY3RvcnkiLCBudWxsLCAxLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYWluQ2xhc3MiLCBudWxsLCAwLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2bVBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NwYXRoUmVmZXJlbmNlIiwgbnVsbCwgMCwgMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fRGVidWdQb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVidWdQb3J0IiwgbnVsbCwgMCwgMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKSwgdGhpcy5nZXRFeHRlcm5hbCgpLCBudWxsLCAiZXh0ZXJuYWwiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAxLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfUHVibGlzaERpcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1Ymxpc2hEaXIiLCBudWxsLCAxLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVibGlzaGVyUmVmZXJlbmNlIiwgbnVsbCwgMSwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05vKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm8iLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0X1Byb3RvY29sKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvdG9jb2wiLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2plY3RFQ2xhc3MsIFByb2plY3QuY2xhc3MsICJQcm9qZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzcGF0aFJlZmVyZW5jZSIsIG51bGwsIDEsIDEsIFByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvcGVydHlFQ2xhc3MsIFByb3BlcnR5LmNsYXNzLCAiUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5X0NvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZXh0IiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9EZWZhdWx0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfTGFiZWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsYWJlbCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdWJsaXNoZXJFQ2xhc3MsIFB1Ymxpc2hlci5jbGFzcywgIlB1Ymxpc2hlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBQdWJsaXNoZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpLCB0aGlzLmdldFB1Ymxpc2hlckRhdGEoKSwgbnVsbCwgInB1Ymxpc2hlcmRhdGEiLCBudWxsLCAxLCAtMSwgUHVibGlzaGVyLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQdWJsaXNoZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFB1Ymxpc2hlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdWJsaXNoZXJEYXRhRUNsYXNzLCBQdWJsaXNoZXJEYXRhLmNsYXNzLCAiUHVibGlzaGVyRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRhdGFuYW1lIiwgbnVsbCwgMSwgMSwgUHVibGlzaGVyRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGF0YXZhbHVlIiwgbnVsbCwgMSwgMSwgUHVibGlzaGVyRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAiU2VydmVyUnVudGltZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfUHJvcGVydHkoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydHkiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIHRoaXMuZ2V0UG9ydCgpLCBudWxsLCAicG9ydCIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCB0aGlzLmdldE1vZHVsZSgpLCBudWxsLCAibW9kdWxlIiwgbnVsbCwgMSwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpLCB0aGlzLmdldFByb2plY3QoKSwgbnVsbCwgInByb2plY3QiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIHRoaXMuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLCBudWxsLCAic3RhcnQiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKSwgdGhpcy5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksIG51bGwsICJzdG9wIiwgbnVsbCwgMSwgMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9QdWJsaXNoZXIoKSwgdGhpcy5nZXRQdWJsaXNoZXIoKSwgbnVsbCwgInB1Ymxpc2hlciIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCB0aGlzLmdldENsYXNzcGF0aCgpLCBudWxsLCAiY2xhc3NwYXRoIiwgbnVsbCwgMSwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfSm5kaUNvbm5lY3Rpb24oKSwgdGhpcy5nZXRKbmRpQ29ubmVjdGlvbigpLCBudWxsLCAiam5kaUNvbm5lY3Rpb24iLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcmNoaXZlVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXJjaGl2ZV8uX3R5cGUiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwYXRoIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFyZ3VtZW50UGFpckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJndW1lbnRQYWlyIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcmd1bWVudFBhaXJfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2YWx1ZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjbGFzc3BhdGhFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNsYXNzcGF0aCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2xhc3NwYXRoX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImFyY2hpdmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDbGFzc3BhdGhfRmlsZXNldCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJmaWxlc2V0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2xhc3NwYXRoX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhjbHVkZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImV4Y2x1ZGVfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeGNsdWRlVHlwZV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChleHRlcm5hbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXh0ZXJuYWwiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeHRlcm5hbF9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4dGVybmFsX09zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAib3MiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZmlsZXNldFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZpbGVzZXRfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9JbmNsdWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImluY2x1ZGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImV4Y2x1ZGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9DYXNlc2Vuc2l0aXZlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2FzZXNlbnNpdGl2ZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9EaXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJkaXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW5jbHVkZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImluY2x1ZGVfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbmNsdWRlVHlwZV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqbmRpQ29ubmVjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiam5kaUNvbm5lY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3ZpZGVyVXJsIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpUHJvcGVydHkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiaW5pdGlhbENvbnRleHRGYWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkxhdW5jaENvbmZpZ3VyYXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImVudmlyb25tZW50VmFyaWFibGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvZ3JhbUFyZ3VtZW50cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ3b3JraW5nRGlyZWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm1haW5DbGFzcyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2bVBhcmFtZXRlcnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGhSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVidWdQb3J0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImV4dGVybmFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1vZHVsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTW9kdWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ0eXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9QdWJsaXNoRGlyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hEaXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJwdWJsaXNoZXJSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocG9ydEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UG9ydF9ObygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJubyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X1Byb3RvY29sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3RvY29sIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2plY3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2plY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2plY3RfQ2xhc3NwYXRoUmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImNsYXNzcGF0aFJlZmVyZW5jZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvcGVydHkiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0NvbnRleHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjb250ZXh0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0RlZmF1bHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJkZWZhdWx0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvcGVydHlfTGFiZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsYWJlbCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eV9UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlB1Ymxpc2hlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHVibGlzaGVyX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlcmRhdGEiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJEYXRhRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQdWJsaXNoZXJEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGFuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGF2YWx1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmVyUnVudGltZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VydmVyUnVudGltZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3BlcnR5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJtb2R1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvamVjdCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInN0YXJ0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJzdG9wIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGgiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpQ29ubmVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwotCX0KLQotfSAvL1NlcnZlclR5cGVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE4NmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclR5cGVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFNlcnZlclR5cGVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlVHlwZShBcmNoaXZlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmd1bWVudFBhaXIoQXJndW1lbnRQYWlyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcmd1bWVudFBhaXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDbGFzc3BhdGgoQ2xhc3NwYXRoIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDbGFzc3BhdGhBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlVHlwZShFeGNsdWRlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlcm5hbChFeHRlcm5hbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZXJuYWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlc2V0VHlwZShGaWxlc2V0VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsZXNldFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmNsdWRlVHlwZShJbmNsdWRlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5jbHVkZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSm5kaUNvbm5lY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMYXVuY2hDb25maWd1cmF0aW9uKExhdW5jaENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2plY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQdWJsaXNoZXIoUHVibGlzaGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQdWJsaXNoZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQdWJsaXNoZXJEYXRhKFB1Ymxpc2hlckRhdGEgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVB1Ymxpc2hlckRhdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2ZXJSdW50aW1lKFNlcnZlclJ1bnRpbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZlclJ1bnRpbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJjaGl2ZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIDxlbT5Bcmd1bWVudCBQYWlyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyZ3VtZW50UGFpckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGFzc3BhdGhBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGUgPGVtPkV4Y2x1ZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVybmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlIDxlbT5GaWxlc2V0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWxlc2V0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSA8ZW0+SW5jbHVkZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5jbHVkZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpuZGlDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24gPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2plY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyIDxlbT5QdWJsaXNoZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHVibGlzaGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEgPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQdWJsaXNoZXJEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2ZXJSdW50aW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0OTliNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBTZXJ2ZXJUeXBlUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NjMyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZVJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotfSAvL1NlcnZlclR5cGVSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTkzM2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclR5cGVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJDSElWRV9UWVBFOiB7Ci0JCQkJQXJjaGl2ZVR5cGUgYXJjaGl2ZVR5cGUgPSAoQXJjaGl2ZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFyY2hpdmVUeXBlKGFyY2hpdmVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVI6IHsKLQkJCQlBcmd1bWVudFBhaXIgYXJndW1lbnRQYWlyID0gKEFyZ3VtZW50UGFpcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJndW1lbnRQYWlyKGFyZ3VtZW50UGFpcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEg6IHsKLQkJCQlDbGFzc3BhdGggY2xhc3NwYXRoID0gKENsYXNzcGF0aCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWENMVURFX1RZUEU6IHsKLQkJCQlFeGNsdWRlVHlwZSBleGNsdWRlVHlwZSA9IChFeGNsdWRlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhjbHVkZVR5cGUoZXhjbHVkZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUw6IHsKLQkJCQlFeHRlcm5hbCBleHRlcm5hbCA9IChFeHRlcm5hbCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZXJuYWwoZXh0ZXJuYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFOiB7Ci0JCQkJRmlsZXNldFR5cGUgZmlsZXNldFR5cGUgPSAoRmlsZXNldFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbGVzZXRUeXBlKGZpbGVzZXRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRTogewotCQkJCUluY2x1ZGVUeXBlIGluY2x1ZGVUeXBlID0gKEluY2x1ZGVUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbmNsdWRlVHlwZShpbmNsdWRlVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT046IHsKLQkJCQlKbmRpQ29ubmVjdGlvbiBqbmRpQ29ubmVjdGlvbiA9IChKbmRpQ29ubmVjdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSm5kaUNvbm5lY3Rpb24oam5kaUNvbm5lY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT046IHsKLQkJCQlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZ3VyYXRpb24gPSAoTGF1bmNoQ29uZmlndXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRTogewotCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGUobW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlQ6IHsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST0pFQ1Q6IHsKLQkJCQlQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZOiB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUjogewotCQkJCVB1Ymxpc2hlciBwdWJsaXNoZXIgPSAoUHVibGlzaGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQdWJsaXNoZXIocHVibGlzaGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBOiB7Ci0JCQkJUHVibGlzaGVyRGF0YSBwdWJsaXNoZXJEYXRhID0gKFB1Ymxpc2hlckRhdGEpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVB1Ymxpc2hlckRhdGEocHVibGlzaGVyRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRTogewotCQkJCVNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IChTZXJ2ZXJSdW50aW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2ZXJSdW50aW1lKHNlcnZlclJ1bnRpbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJjaGl2ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlVHlwZShBcmNoaXZlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJndW1lbnQgUGFpcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJndW1lbnRQYWlyKEFyZ3VtZW50UGFpciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNsYXNzcGF0aChDbGFzc3BhdGggb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlVHlwZShFeGNsdWRlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlcm5hbChFeHRlcm5hbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbGVzZXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWxlc2V0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbGVzZXRUeXBlKEZpbGVzZXRUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluY2x1ZGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5jbHVkZVR5cGUoSW5jbHVkZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMYXVuY2hDb25maWd1cmF0aW9uKExhdW5jaENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVB1Ymxpc2hlcihQdWJsaXNoZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHVibGlzaGVyRGF0YShQdWJsaXNoZXJEYXRhIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZlclJ1bnRpbWUoU2VydmVyUnVudGltZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vU2VydmVyVHlwZVN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGY4ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCVNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IFNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzFlMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9SZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSUR5bmFtaWNWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLQotLyoqCi0gKiBVdGlsaXR5IHRvIHJlc29sdmUgc2VydmVyZGVmL3J1bnRpbWVkZWYgcHJvcGVydGllcyB3aXRoIHRoZSB1c2VyIHByb3ZpZGVkIGRhdGEuCi0gKiBSZXNvbHZlciBhbHNvIGxvb2tzIHRocm91Z2ggZWNsaXBzZSBwbGF0Zm9ybSBwcm92aWRlZCBkeW5hbWljIHZhcmlhYmxlcyB0byAKLSAqIHJlc29sdmUgYSBwcm9wZXJ0eS4gCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFJlc29sdmVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TVEFSVDIgPSAiJXsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRU5EID0gIn0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RBUlQgPSAiJHsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNYXAgZlByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIFNlcnZlclJ1bnRpbWUgc2VydmVyOwotCQotICAgIC8qKgotCSAqIEBwYXJhbSBydW50aW1lIAotCSAqLwotCXB1YmxpYyBSZXNvbHZlcihTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdGhpcy5zZXJ2ZXIgPSBydW50aW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVzb2x2ZWQgc3RyaW5nLgotICAgICAqIAotCSAqIEBwYXJhbSBwcm9wcGVkU3RyaW5nCi0JICogQHJldHVybiByZXNvbHZlZCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzKFN0cmluZyBwcm9wcGVkU3RyaW5nKSB7Ci0JCUhhc2hNYXAgY2FjaGUgPSBuZXcgSGFzaE1hcChnZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eSBlbGVtZW50ID0oUHJvcGVydHkpIGl0ci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldERlZmF1bHQoKTsKLQkJCWlmKGZQcm9wZXJ0eVZhbHVlcyAhPSBudWxsICYmIGZQcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShlbGVtZW50LmdldElkKCkpKQotCQkJICAgIHZhbHVlPShTdHJpbmcpZlByb3BlcnR5VmFsdWVzLmdldChlbGVtZW50LmdldElkKCkpOwotCQkJaWYoUHJvcGVydHkuVFlQRV9ESVJFQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSB8fCBQcm9wZXJ0eS5UWVBFX0ZJTEUuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSkKLQkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcJywnLycpOwotCQkJIGNhY2hlLnB1dChlbGVtZW50LmdldElkKCksIHZhbHVlKTsKLQkJfQotCQljYWNoZS5wdXQoInBhdGhDaGFyIiwgRmlsZS5wYXRoU2VwYXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyID0gcmVzb2x2ZVByb3BlcnRpZXNGcm9tQ2FjaGUocHJvcHBlZFN0cmluZywgY2FjaGUpOwotCQlzdHIgPSBmaXhQYXNzdGhyb3VnaFByb3BlcnRpZXMoc3RyKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuc2VydmVyLmdldFByb3BlcnR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKLQkJU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gc3RyOwotCQlpZiAoaXNQYXNzUHJvcGVydHlMZWZ0KHJlc29sdmVkU3RyaW5nKSkgewotCQkJcmVzb2x2ZWRTdHJpbmcgPSBmaXhQYXJhbShyZXNvbHZlZFN0cmluZyk7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IGZpeFBhc3N0aHJvdWdoUHJvcGVydGllcyhyZXNvbHZlZFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKAotCQlTdHJpbmcgcHJvcHBlZFN0cmluZywKLQkJSGFzaE1hcCBjYWNoZSkgewotCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBwcm9wcGVkU3RyaW5nOwotCQlpbnQgc3RhcnQgPSBza2lwVG9Qcm9wZXJ0eShyZXNvbHZlZFN0cmluZywgY2FjaGUpOy8vIHNlZSBpZiB0aGVyZSBhcmUgcHJvcGVydGllcyB0byBiZSByZXNvbHZlZC4KLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCXJlc29sdmVkU3RyaW5nID0gcmVzb2x2ZVByb3BlcnR5KHJlc29sdmVkU3RyaW5nLCBjYWNoZSk7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKHJlc29sdmVkU3RyaW5nLCBjYWNoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwotCX0KLQotCXByaXZhdGUgaW50IHNraXBUb1Byb3BlcnR5KFN0cmluZyBzdHIsSGFzaE1hcCBjYWNoZSkgewotCQlpbnQgc3RhcnQgPSAtMTsgCi0JCWludCBlbmQgPSAgMDsKLQkJU3RyaW5nIGtleT0iIjsgLy8kTk9OLU5MUy0xJAotCQlkbyB7Ci0JCQlzdGFydCA9ICBzdHIuaW5kZXhPZihQUk9QX1NUQVJULGVuZCk7Ci0JCQlpZiggc3RhcnQgPCAwKQotCQkJCXJldHVybiBzdGFydDsKLQkJCWVuZCA9IHN0ci5pbmRleE9mKFBST1BfRU5ELCBzdGFydCk7Ci0JCQlrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKLQkJfQotCQl3aGlsZSggIWNhY2hlLmNvbnRhaW5zS2V5KCBrZXkgKSAmJiBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLmdldER5bmFtaWNWYXJpYWJsZSgga2V5ICkgPT0gbnVsbCApOwotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1Bhc3NQcm9wZXJ0eUxlZnQoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyLmluZGV4T2YoUFJPUF9TVEFSVDIpID49IDA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVByb3BlcnR5KFN0cmluZyBwcm9wcGVkU3RyaW5nLCBIYXNoTWFwIGNhY2hlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3BwZWRTdHJpbmcpOwotCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihQUk9QX1NUQVJUKTsKLQkJaW50IGVuZCA9IHN0ci5pbmRleE9mKFBST1BfRU5ELCBzdGFydCk7Ci0JCVN0cmluZyBrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyljYWNoZS5nZXQoa2V5KTsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCApey8vIGxvb2sgaW4gZWNsaXBzZSB2YXJpYWJsZXMKLSAgICAgICAgICAgIElEeW5hbWljVmFyaWFibGUgZHYgPSAgVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5nZXREeW5hbWljVmFyaWFibGUoIGtleSApOwotICAgICAgICAgICAgaWYgKGR2ICE9IG51bGwgKXsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGR2LmdldFZhbHVlKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICl7Ci0gICAgICAgICAgICAgICAgICAgIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCByZXNvbHZlIGVjbGlwc2UgdmFyaWFibGUiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJaWYodmFsdWUgPT0gbnVsbCApCi0JCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdHIucmVwbGFjZSggc3RhcnQsIGVuZCsxLCB2YWx1ZSApLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGZpeFBhcmFtKFN0cmluZyBwcm9wcGVkU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHIgPSBwcm9wcGVkU3RyaW5nOwotCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihQUk9QX1NUQVJUMik7Ci0JCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0KQotCQkJKyBQUk9QX1NUQVJUCi0JCQkrIHN0ci5zdWJzdHJpbmcoc3RhcnQrMik7Ci0JfQotICAgIAotCS8qKgotICAgICAqIFNldCB0aGUgbmFtZSB2YWx1ZSBwYWlycyB0aGF0IHRoZSByZWNlaXZlciByZXNvbHZlciBpbnN0YW5jZQotICAgICAqIHVzZXMgdG8gcmVzb2x2ZSBzZXJ2ZXJkZWYvcnVudGltZWRlZiBwcm9wZXJ0aWVzLgotICAgICAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgZlByb3BlcnR5VmFsdWVzIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlcyhNYXAgcHJvcGVydHlWYWx1ZXMpIHsKLQkJZlByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9YTUxVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9YTUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU4N2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC94bWwvWE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLkV4dGVuc2lvblBvaW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGZvciBoYW5kbGluZyB0aGUgeG1sIGRhdGEgZnJvbSAuc2VydmVyZGVmIGFuZCAucnVudGltZWRlZiBmaWxlcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWxzIHsKLQotCQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHNlcnZlckRlZmluaXRpb25zOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IHJ1bnRpbWVEZWZpbml0aW9uczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWE1MVXRpbHMoKSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGFsbCB0aGUgc2VydmVyZGVmaW5pdGlvbiBhbmQgcnVudGltZWRlZmluaXRpb24gZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgc2VydmVyRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBJRXh0ZW5zaW9uW10gc2VydmVyRGVmRXh0ZW5zaW9ucyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRHZW5lcmljU2VydmVyRGVmaW5pdGlvbkV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBzZXJ2ZXJEZWZFeHRlbnNpb25zICE9IG51bGwgJiYgaSA8IHNlcnZlckRlZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSSSBkZWZpbml0aW9uRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IHNlcnZlckRlZkV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkZpbGUgPSBnZXREZWZpbml0aW9uRmlsZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSByZWFkRmlsZShkZWZpbml0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldElkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEZWZpbml0aW9ucy5hZGQocnVudGltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcnVudGltZURlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgSUV4dGVuc2lvbltdIHJ1bnRpbWVEZWZFeHRlbnNpb25zID0gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldEdlbmVyaWNTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbkV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBydW50aW1lRGVmRXh0ZW5zaW9ucyAhPSBudWxsICYmIGkgPCBydW50aW1lRGVmRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgamF2YS5uZXQuVVJJIGRlZmluaXRpb25GaWxlID0gbnVsbDsKLSAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gcnVudGltZURlZkV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkZpbGUgPSBnZXREZWZpbml0aW9uRmlsZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSByZWFkRmlsZShkZWZpbml0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldElkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBydW50aW1lRGVmaW5pdGlvbnMuYWRkKHJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS5uZXQuVVJJIGdldERlZmluaXRpb25GaWxlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIAotICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBTdHJpbmcgZGVmaW5pdGlvbkZpbGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVmaW5pdGlvbmZpbGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsIkxvYWRpbmcgc2VydmVyZGVmIGZpbGUgIitkZWZpbml0aW9uRmlsZSsiIGZyb20gYnVuZGxlICIrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAotICAgICAgICBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KGRlZmluaXRpb25GaWxlKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELDEsCi0gICAgICAgICAgICAgICAgICAgICJEZWZpbml0aW9uIGZpbGUgIitkZWZpbml0aW9uRmlsZSsiIGNhbiBub3QgYmUgcmVzb2x2ZWQgaW4gYnVuZGxlICIrIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSAsbnVsbCkgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCQl0cnkgewotCQkJamF2YS5uZXQuVVJJIHVyaSA9IG5ldyBqYXZhLm5ldC5VUkkodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksdXJsLmdldFBhdGgoKSwgdXJsLmdldFF1ZXJ5KCkpOwotCQkgICAgcmV0dXJuIHVyaTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIHJlYWRGaWxlKGphdmEubmV0LlVSSSBmaWxlKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIHJlc291cmNlIHNldC4KLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgcmVzb3VyY2UgZmFjdG9yeSAtLSBvbmx5IG5lZWRlZCBmb3IKLSAgICAgICAgLy8gc3RhbmQtYWxvbmUhCi0gICAgICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkKLSAgICAgICAgICAgICAgICAucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0KLSAgICAgICAgIFNlcnZlclR5cGVQYWNrYWdlIGdzdFBhY2sgPSBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0gICAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVVSSShmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIERlbWFuZCBsb2FkIHRoZSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVUkksIHRydWUpOwotICAgICAgICB9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHN0aCB3cm9uZyB3aXRoIHRoaXMgLnNlcnZlciBmaWxlLgotICAgICAgICAgICAgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBsb2FkaW5nIHRoZSBzZXJ2ZXIgdHlwZSBkZWZpbml0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmVyUnVudGltZSBkZWYgPSAoU2VydmVyUnVudGltZSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWYuc2V0RmlsZW5hbWUoZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YgPGNvZGU+U2VydmVyUnVudGltZTwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHNlcnZlckRlZmluaXRpb25zOwotCX0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVtb3J5IHByZXNlbnRhdGlvbiBmb3IgdGhlIC5zZXJ2ZXJkZWYgZmlsZQotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gc2VydmVyUnVudGltZQotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclR5cGVEZWZpbml0aW9uKFN0cmluZyBpZCkgewotICAgIAlJdGVyYXRvciBkZWZzID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGlkICE9IG51bGwgJiYgZGVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNlcnZlclJ1bnRpbWUgZWxlbSA9IChTZXJ2ZXJSdW50aW1lKSBkZWZzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICggZWxlbS5nZXRJZCgpLmVxdWFscyggaWQgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YgPGNvZGU+U2VydmVyUnVudGltZTwvY29kZT5zLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJ1bnRpbWVUeXBlRGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBydW50aW1lRGVmaW5pdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZW1vcnkgcHJlc2VudGF0aW9uIGZvciB0aGUgLnJ1bnRpbWVkZWYgZmlsZQotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gcnVudGltZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRSdW50aW1lVHlwZURlZmluaXRpb24oU3RyaW5nIGlkKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGRlZnMgPSBnZXRSdW50aW1lVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGRlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIGVsZW0gPSAoU2VydmVyUnVudGltZSkgZGVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIGVsZW0uZ2V0SWQoKS5lcXVhbHMoaWQpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWFjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9BcmNoaXZlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyY2hpdmUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0QXJjaGl2ZVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2FyY2hpdmVfLl90eXBlJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhdGgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmNoaXZlVHlwZV9QYXRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncGF0aCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhdGgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcmNoaXZlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Bcmd1bWVudFBhaXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQXJndW1lbnRQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmM5Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Bcmd1bWVudFBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcmd1bWVudCBQYWlyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmd1bWVudFBhaXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FyZ3VtZW50UGFpcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyZ3VtZW50UGFpciBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEFyZ3VtZW50UGFpcl9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmd1bWVudFBhaXJfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3ZhbHVlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcmd1bWVudFBhaXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQ2xhc3NwYXRoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0NsYXNzcGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ5MzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEFyY2hpdmUgPGVtPkFyY2hpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEZpbGVzZXQgPGVtPkZpbGVzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGgoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NsYXNzcGF0aCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzcGF0aCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGhfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJjaGl2ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJjaGl2ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyY2hpdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldENsYXNzcGF0aF9BcmNoaXZlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2FyY2hpdmUnIGdyb3VwPScjZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFyY2hpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGVzZXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGVzZXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlc2V0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGhfRmlsZXNldCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdmaWxlc2V0JyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRGaWxlc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Q2xhc3NwYXRoX0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIENsYXNzcGF0aApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeGNsdWRlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeGNsdWRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmYwMTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRXhjbHVkZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4Y2x1ZGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXhjbHVkZVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2V4Y2x1ZGVfLl90eXBlJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjbHVkZVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRFeGNsdWRlVHlwZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFeGNsdWRlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeHRlcm5hbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeHRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I5YTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRXh0ZXJuYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWwoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVybmFsJyBraW5kPSdzaW1wbGUnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEV4dGVybmFsX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9JzowJyBraW5kPSdzaW1wbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWxfT3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdvcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3MoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFeHRlcm5hbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9GaWxlc2V0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9GaWxlc2V0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdhOTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRmlsZXNldFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZXNldCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RXhjbHVkZSA8ZW0+RXhjbHVkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyIDxlbT5EaXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RmlsZXNldFR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2ZpbGVzZXRfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZXNldFR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RmlsZXNldFR5cGVfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5jbHVkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0luY2x1ZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0naW5jbHVkZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5jbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0V4Y2x1ZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZXhjbHVkZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXhjbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzZXNlbnNpdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNlc2Vuc2l0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhc2VzZW5zaXRpdmUoKQotCSAqIEBzZWUgI3Vuc2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRGaWxlc2V0VHlwZV9DYXNlc2Vuc2l0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2Nhc2VzZW5zaXRpdmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ2FzZXNlbnNpdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2VzZW5zaXRpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRDYXNlc2Vuc2l0aXZlKCkKLQkgKiBAc2VlICNpc0Nhc2VzZW5zaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2VzZW5zaXRpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjaXNDYXNlc2Vuc2l0aXZlIDxlbT5DYXNlc2Vuc2l0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENhc2VzZW5zaXRpdmUoKQotCSAqIEBzZWUgI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q2FzZXNlbnNpdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSA8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjaXNDYXNlc2Vuc2l0aXZlKCkKLQkgKiBAc2VlICNzZXRDYXNlc2Vuc2l0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDYXNlc2Vuc2l0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0RpcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RpciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyIDxlbT5EaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXIoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBGaWxlc2V0VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9JbmNsdWRlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9JbmNsdWRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODIzZGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSW5jbHVkZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmNsdWRlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEluY2x1ZGVUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdpbmNsdWRlXy5fdHlwZScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluY2x1ZGVUeXBlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0SW5jbHVkZVR5cGVfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5jbHVkZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSm5kaUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSm5kaUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYzZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0puZGlDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpuZGkgQ29ubmVjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsIDxlbT5Qcm92aWRlciBVcmw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEpuZGlQcm9wZXJ0eSA8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdqbmRpQ29ubmVjdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpuZGlDb25uZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXIgVXJsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm92aWRlclVybChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwcm92aWRlclVybCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlclVybCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRQcm92aWRlclVybCA8ZW0+UHJvdmlkZXIgVXJsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3ZpZGVyVXJsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm92aWRlclVybChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpuZGkgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KbmRpIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdqbmRpUHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEpuZGlQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2luaXRpYWxDb250ZXh0RmFjdG9yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5IDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSm5kaUNvbm5lY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9MYXVuY2hDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjYzY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9MYXVuY2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhdW5jaCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0UHJvZ3JhbUFyZ3VtZW50cyA8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldE1haW5DbGFzcyA8ZW0+TWFpbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Vm1QYXJhbWV0ZXJzIDxlbT5WbSBQYXJhbWV0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RGVidWdQb3J0IDxlbT5EZWJ1ZyBQb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFeHRlcm5hbCA8ZW0+RXh0ZXJuYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTGF1bmNoQ29uZmlndXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhdW5jaENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudmlyb25tZW50IFZhcmlhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRW52aXJvbm1lbnRWYXJpYWJsZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZW52aXJvbm1lbnRWYXJpYWJsZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ncmFtIEFyZ3VtZW50czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3Byb2dyYW1Bcmd1bWVudHMnIGdyb3VwPScjZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBjb25jYXRlbmF0ZWQgU3RyaW5nIG9mIGFsbCBQcm9ncmFtIEFyZ3VtZW50cwotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKTsKLQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nd29ya2luZ0RpcmVjdG9yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0V29ya2luZ0RpcmVjdG9yeSA8ZW0+V29ya2luZyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYWluIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5DbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J21haW5DbGFzcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRNYWluQ2xhc3MgPGVtPk1haW4gQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZtIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZtIFBhcmFtZXRlcnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WbSBQYXJhbWV0ZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSd2bVBhcmFtZXRlcnMnIGdyb3VwPScjZ3JvdXA6NiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFZtUGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbmNhdGVuYXRlZCBTdHJpbmcgb2YgYWxsIFZtIHBhcmFtZXRlcnMuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzcGF0aFJlZmVyZW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aFJlZmVyZW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWJ1ZyBQb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWJ1ZyBQb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYnVnUG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRGVidWdQb3J0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RlYnVnUG9ydCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWJ1Z1BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVidWdQb3J0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FeHRlcm5hbCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdleHRlcm5hbCcgZ3JvdXA9JyNncm91cDoxMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVybmFsKCk7Ci0KLX0gLy8gTGF1bmNoQ29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjg1MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hEaXIgPGVtPlB1Ymxpc2ggRGlyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNb2R1bGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGVfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ndHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoIERpcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1Ymxpc2hEaXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGVfUHVibGlzaERpcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHVibGlzaERpciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdWJsaXNoRGlyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoRGlyIDxlbT5QdWJsaXNoIERpcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGlzaGVyUmVmZXJlbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHVibGlzaGVyUmVmZXJlbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1Ymxpc2hlclJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaGVyUmVmZXJlbmNlIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1Ymxpc2hlclJlZmVyZW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1vZHVsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyNmI5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldFByb3RvY29sIDxlbT5Qcm90b2NvbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQb3J0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQb3J0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ObzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ObzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQb3J0X05vKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdubyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRObygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5vIDxlbT5ObzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRObyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3RvY29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9Qcm90b2NvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvdG9jb2wnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1Byb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJkYzBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0I2dldENsYXNzcGF0aFJlZmVyZW5jZSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQcm9qZWN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9qZWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aFJlZmVyZW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAwYWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9wZXJ0eScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRU9iamVjdHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JVTlRJTUUgPSAicnVudGltZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9TRVJWRVIgPSAic2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJTEU9ImZpbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRElSRUNUT1JZPSJkaXJlY3RvcnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQk9PTEVBTj0iYm9vbGVhbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUPSJzdHJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUPSJzZWxlY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUX0VESVQ9ImNvbWJvIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5X0NvbnRleHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbnRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0Q29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGV4dChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfRGVmYXVsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RlZmF1bHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfSWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFiZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQcm9wZXJ0eV9MYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xhYmVsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyNWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0UHVibGlzaGVyZGF0YSA8ZW0+UHVibGlzaGVyZGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHVibGlzaGVyJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGlzaGVyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXJkYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXJkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXJkYXRhJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQdWJsaXNoZXJkYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyX0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFB1Ymxpc2hlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9QdWJsaXNoZXJEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmZjMyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QdWJsaXNoZXIgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHVibGlzaGVyRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFB1Ymxpc2hlckRhdGEgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YW5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERhdGFuYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZGF0YW5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YW5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhbmFtZSA8ZW0+RGF0YW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF0YW5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGF2YWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YXZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGF2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YXZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RhdGF2YWx1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREYXRhdmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YXZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhdmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERhdGF2YWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFB1Ymxpc2hlckRhdGEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTdlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuUmVzb2x2ZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZlciBSdW50aW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCQkJR2VuZXJpYyBTZXJ2ZXIgVHlwZSBEZWZpbml0aW9uLiBJdCBtdXN0IGhhdmUgYSBsaXN0IG9mCi0gKiAJCQkJcHJvcGVydGllcy4KLSAqIAkJCQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFBvcnQgPGVtPlBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTZXJ2ZXJSdW50aW1lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyUnVudGltZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3Byb3BlcnR5JyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwb3J0JyBncm91cD0nI2dyb3VwOjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdtb2R1bGUnIGdyb3VwPScjZ3JvdXA6NCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0KFByb2plY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvamVjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3QoUHJvamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0YXJ0KExhdW5jaENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfU3RhcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3N0YXJ0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChMYXVuY2hDb25maWd1cmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3N0b3AnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMYXVuY2hDb25maWd1cmF0aW9uIGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKExhdW5jaENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXInIGdyb3VwPScjZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFB1Ymxpc2hlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGh9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nam5kaUNvbm5lY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKbmRpQ29ubmVjdGlvbiBnZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEByZXR1cm4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCU1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogQHBhcmFtIGNwUmVmIHRoZSByZWZlcmVuY2UgaWQgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlDbGFzc3BhdGggZ2V0Q2xhc3NwYXRoKFN0cmluZyBjcFJlZik7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICogQHBhcmFtIGlkCi0gICAgICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotICAgIAotICAgIAotICAgIAotICAgIAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JU3RyaW5nIGdldEZpbGVuYW1lKCk7Ci0KLSAgICAKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotICovCi0Jdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZm4pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQl2b2lkIHNldFByb3BlcnR5VmFsdWVzKE1hcCBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKLQkKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpOwotICAgIC8qKgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JLyoqCi0JICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEByZXR1cm4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCVB1Ymxpc2hlciBnZXRQdWJsaXNoZXIoU3RyaW5nIGlkKTsKLX0gLy8gU2VydmVyUnVudGltZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWJlOTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyVHlwZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJjaGl2ZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFyY2hpdmVUeXBlIGNyZWF0ZUFyY2hpdmVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFyZ3VtZW50UGFpciBjcmVhdGVBcmd1bWVudFBhaXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNsYXNzcGF0aCBjcmVhdGVDbGFzc3BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGNsdWRlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4Y2x1ZGVUeXBlIGNyZWF0ZUV4Y2x1ZGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZXJuYWwgY3JlYXRlRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZXNldCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlc2V0IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZpbGVzZXRUeXBlIGNyZWF0ZUZpbGVzZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluY2x1ZGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmNsdWRlVHlwZSBjcmVhdGVJbmNsdWRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSm5kaUNvbm5lY3Rpb24gY3JlYXRlSm5kaUNvbm5lY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZSBjcmVhdGVNb2R1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9ydCBjcmVhdGVQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgY3JlYXRlUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQdWJsaXNoZXIgY3JlYXRlUHVibGlzaGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHVibGlzaGVyRGF0YSBjcmVhdGVQdWJsaXNoZXJEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2ZXIgUnVudGltZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmVyUnVudGltZSBjcmVhdGVTZXJ2ZXJSdW50aW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZlclR5cGVQYWNrYWdlIGdldFNlcnZlclR5cGVQYWNrYWdlKCk7Ci0KLX0gLy9TZXJ2ZXJUeXBlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQyZGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6anN0PSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIj4KLQotCi0KLQk8Y29tcGxleFR5cGUgbmFtZT0iU2VydmVyUnVudGltZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJR2VuZXJpYyBTZXJ2ZXIgVHlwZSBEZWZpbml0aW9uLiBJdCBtdXN0IGhhdmUgYSBsaXN0IG9mCi0JCQkJcHJvcGVydGllcy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCi0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9ImpzdDpQcm9wZXJ0eSIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJwb3J0IiB0eXBlPSJqc3Q6UG9ydCIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJtb2R1bGUiIHR5cGU9ImpzdDpNb2R1bGUiIC8+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0icHJvamVjdCIgdHlwZT0ianN0OlByb2plY3QiIC8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJzdGFydCIgdHlwZT0ianN0OkxhdW5jaENvbmZpZ3VyYXRpb24iIC8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJzdG9wIiB0eXBlPSJqc3Q6TGF1bmNoQ29uZmlndXJhdGlvbiIgLz4KLQotCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9InB1Ymxpc2hlciIgdHlwZT0ianN0OlB1Ymxpc2hlciIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9ImpzdDpDbGFzc3BhdGgiIC8+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iam5kaUNvbm5lY3Rpb24iIHR5cGU9ImpzdDpqbmRpQ29ubmVjdGlvbiIgLz4KLQkJPC9zZXF1ZW5jZT4KLQotCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIC8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQcm9wZXJ0eSI+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiAvPgotCQk8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0IiB0eXBlPSJzdHJpbmciIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ic3RyaW5nIiAvPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iTW9kdWxlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaERpciIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyUmVmZXJlbmNlIiB0eXBlPSJzdHJpbmciIC8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJMYXVuY2hDb25maWd1cmF0aW9uIj4KLQkJPHNlcXVlbmNlPgotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTxlbGVtZW50IG5hbWU9ImVudmlyb25tZW50VmFyaWFibGUiCi0JCQkJCXR5cGU9ImpzdDpBcmd1bWVudFBhaXIiPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icHJvZ3JhbUFyZ3VtZW50cyIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPC9zZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IndvcmtpbmdEaXJlY3RvcnkiIHR5cGU9InN0cmluZyIgLz4KLQkJCTxjaG9pY2U+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJtYWluQ2xhc3MiIHR5cGU9InN0cmluZyIgLz4KLQkJCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0idm1QYXJhbWV0ZXJzIiB0eXBlPSJzdHJpbmciIC8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJkZWJ1Z1BvcnQiIHR5cGU9InN0cmluZyIgLz4KLQkJCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjEiPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwiIHR5cGU9ImpzdDpFeHRlcm5hbCI+PC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2Nob2ljZT4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IlBvcnQiPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJubyIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHJvdG9jb2wiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IkNsYXNzcGF0aCI+Ci0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCTxjaG9pY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iYXJjaGl2ZSI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxhdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ic3RyaW5nIiAvPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJmaWxlc2V0Ij4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0JCQkJCQkJPGNob2ljZT4KLQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iaW5jbHVkZSI+Ci0JCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIgotCQkJCQkJCQkJCQl0eXBlPSJzdHJpbmciPgotCQkJCQkJCQkJCTwvYXR0cmlidXRlPgotCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJleGNsdWRlIj4KLQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiCi0JCQkJCQkJCQkJCXR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQkJPC9hdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPC9jaG9pY2U+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0JCQkJCQk8YXR0cmlidXRlIG5hbWU9ImNhc2VzZW5zaXRpdmUiCi0JCQkJCQkJdHlwZT0iYm9vbGVhbiI+Ci0JCQkJCQk8L2F0dHJpYnV0ZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L2Nob2ljZT4KLQkJPC9zZXF1ZW5jZT4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiAvPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaGVyIj4KLQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjEiPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyZGF0YSIgdHlwZT0ianN0OlB1Ymxpc2hlckRhdGEiPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCQk8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIC8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQcm9qZWN0Ij4KLQkJPHNlcXVlbmNlIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIj4KLQkJCTxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdHlwZT0ic3RyaW5nIiAvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaGVyRGF0YSI+Ci0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCQk8ZWxlbWVudCBuYW1lPSJkYXRhbmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0iZGF0YXZhbHVlIiB0eXBlPSJzdHJpbmciIC8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iam5kaUNvbm5lY3Rpb24iPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJwcm92aWRlclVybCIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9ImpuZGlQcm9wZXJ0eSIgdHlwZT0ianN0OkFyZ3VtZW50UGFpciIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IkFyZ3VtZW50UGFpciI+Ci0JCTxhbGwgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiPgotCQkJPGVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9hbGw+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJFeHRlcm5hbCI+Ci0JCTxzaW1wbGVDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9zaW1wbGVDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2YTU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJkZWZpbml0aW9uIgotICAgIG5zVVJJPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIiBuc1ByZWZpeD0iZGVmaW5pdGlvbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJjaGl2ZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXJjaGl2ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhdGgiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icGF0aCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcmd1bWVudFBhaXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJndW1lbnRQYWlyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YWx1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc3BhdGgiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2xhc3NwYXRoIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJjaGl2ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BcmNoaXZlVHlwZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJhcmNoaXZlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlc2V0IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpbGVzZXRUeXBlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImZpbGVzZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4Y2x1ZGVUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImV4Y2x1ZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbXB0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZXJuYWwiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWwiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJvcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWxlc2V0VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaWxlc2V0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW5jbHVkZVR5cGUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaW5jbHVkZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjbHVkZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeGNsdWRlVHlwZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJleGNsdWRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNlc2Vuc2l0aXZlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjYXNlc2Vuc2l0aXZlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpciIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkaXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5jbHVkZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaW5jbHVkZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKbmRpQ29ubmVjdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJqbmRpQ29ubmVjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdmlkZXJVcmwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByb3ZpZGVyVXJsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqbmRpUHJvcGVydHkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXJndW1lbnRQYWlyIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImpuZGlQcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXVuY2hDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW52aXJvbm1lbnRWYXJpYWJsZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bcmd1bWVudFBhaXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZW52aXJvbm1lbnRWYXJpYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ncmFtQXJndW1lbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya2luZ0RpcmVjdG9yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0id29ya2luZ0RpcmVjdG9yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluQ2xhc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1haW5DbGFzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZtUGFyYW1ldGVycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZtUGFyYW1ldGVycyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NwYXRoUmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVidWdQb3J0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkZWJ1Z1BvcnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWwiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWwiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2R1bGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW9kdWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ0eXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1Ymxpc2hEaXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InB1Ymxpc2hEaXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVibGlzaGVyUmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaXNoZXJSZWZlcmVuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJubyIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm90b2NvbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvdG9jb2wiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc3BhdGhSZWZlcmVuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGV4dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjb250ZXh0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVmYXVsdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWJlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsYWJlbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHVibGlzaGVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InB1Ymxpc2hlcmRhdGEiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHVibGlzaGVyRGF0YSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaXNoZXJkYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQdWJsaXNoZXJEYXRhIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1Ymxpc2hlckRhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFuYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkYXRhbmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhdmFsdWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRhdGF2YWx1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2ZXJSdW50aW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtHZW5lcmljIFNlcnZlciBUeXBlIERlZmluaXRpb24uIEl0IG11c3QgaGF2ZSBhIGxpc3Qgb2YmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtwcm9wZXJ0aWVzLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcnZlclJ1bnRpbWUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3J0IiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvcnQiCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icG9ydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTW9kdWxlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1vZHVsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvamVjdCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvamVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGFydCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0xhdW5jaENvbmZpZ3VyYXRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RvcCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0xhdW5jaENvbmZpZ3VyYXRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RvcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InB1Ymxpc2hlciIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QdWJsaXNoZXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHVibGlzaGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc3BhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2xhc3NwYXRoIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNsYXNzcGF0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpuZGlDb25uZWN0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSm5kaUNvbm5lY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iam5kaUNvbm5lY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmVyc2lvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5ZjJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL0FhYS9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiIG1vZGVsTmFtZT0iU2VydmVyVHlwZSIgbW9kZWxQbHVnaW5DbGFzcz0iIgotICAgIHRlc3RTdWl0ZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLnRlc3RzLlNlcnZlcnR5cGVBbGxUZXN0cyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iU2VydmVyVHlwZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlIgotICAgICAgcmVzb3VyY2U9IlhNTCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgZWNvcmVQYWNrYWdlPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyY2hpdmVUeXBlL3BhdGgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2FyY2hpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9maWxlc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9pZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRXhjbHVkZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9FeHRlcm5hbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsL29zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvaW5jbHVkZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZXhjbHVkZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9jYXNlc2Vuc2l0aXZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0ZpbGVzZXRUeXBlL2RpciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSW5jbHVkZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9JbmNsdWRlVHlwZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL3Byb3ZpZGVyVXJsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbi9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vam5kaVByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2luaXRpYWxDb250ZXh0RmFjdG9yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2Vudmlyb25tZW50VmFyaWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vcHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9tYWluQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vdm1QYXJhbWV0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZGVidWdQb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9leHRlcm5hbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hEaXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hlclJlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1BvcnQvbm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1BvcnQvcHJvdG9jb2wiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9qZWN0L2NsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9jb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L2RlZmF1bHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvbGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL3B1Ymxpc2hlcmRhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2lkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyRGF0YS9kYXRhbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhL2RhdGF2YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3Byb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9wb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9tb2R1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9wdWJsaXNoZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2NsYXNzcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9qbmRpQ29ubmVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUueHNkMmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS54c2QyZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWUyMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS54c2QyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTx4c2QyZWNvcmU6WFNEMkVjb3JlTWFwcGluZ1Jvb3QgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzZDJlY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9YU0QyRWNvcmUiIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvIgotICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLyIgdG9wVG9Cb3R0b209InRydWUiPgotICA8bmVzdGVkIGlucHV0cz0iYnVuZGxlZW50cnk6Ly80MzUvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QjLy9zdHJpbmc7WFNEU2ltcGxlVHlwZURlZmluaXRpb249NyIKLSAgICAgIG91dHB1dHM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0FyZ3VtZW50UGFpcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MTAiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQXJndW1lbnRQYWlyIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0FyZ3VtZW50UGFpcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MTAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci9uYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Bcmd1bWVudFBhaXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci92YWx1ZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2FyY2hpdmU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2FyY2hpdmU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZS9wYXRoIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9maWxlc2V0O1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2luY2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9JbmNsdWRlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9pbmNsdWRlO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSW5jbHVkZVR5cGUvbmFtZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2V4Y2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2V4Y2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZS9uYW1lIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iYnVuZGxlZW50cnk6Ly80MzUvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QjLy9ib29sZWFuO1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uPTgiCi0gICAgICBvdXRwdXRzPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9ncm91cCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9pbmNsdWRlIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZXhjbHVkZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2U9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0ZpbGVzZXRUeXBlL2Nhc2VzZW5zaXRpdmUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9maWxlc2V0O1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZGlyIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NSIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvZ3JvdXAiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvYXJjaGl2ZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2ZpbGVzZXQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvaWQiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vRXh0ZXJuYWw7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTExIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0V4dGVybmFsO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xMS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeHRlcm5hbC9vcyIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OSIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbiI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vcHJvdmlkZXJVcmwiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL2puZGlDb25uZWN0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj05L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2puZGlQcm9wZXJ0eSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vam5kaUNvbm5lY3Rpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTkvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vaW5pdGlhbENvbnRleHRGYWN0b3J5Ii8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZW52aXJvbm1lbnRWYXJpYWJsZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vcHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTIiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vbWFpbkNsYXNzIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9My9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAyIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9My9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi92bVBhcmFtZXRlcnMiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9jbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9kZWJ1Z1BvcnQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTMvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9leHRlcm5hbCIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Nb2R1bGU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL01vZHVsZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Mi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3R5cGUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL01vZHVsZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Mi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Nb2R1bGUvcHVibGlzaERpciIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTW9kdWxlO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0yL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL01vZHVsZS9wdWJsaXNoZXJSZWZlcmVuY2UiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUG9ydDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NCIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qb3J0Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1BvcnQ7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTQvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1BvcnQvbm8iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1BvcnQ7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTQvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qb3J0O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj00L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1BvcnQvcHJvdG9jb2wiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvamVjdDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NyIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9qZWN0Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb2plY3Q7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTcvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QvY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZT0zIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvY29udGV4dCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTQiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9kZWZhdWx0Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qcm9wZXJ0eTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9pZCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9sYWJlbCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTIiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS90eXBlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlckRhdGE7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTgiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyRGF0YSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXJEYXRhO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj04L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhL2RhdGFuYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXJEYXRhO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj04L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlckRhdGEvZGF0YXZhbHVlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXIiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHVibGlzaGVyO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj02L1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9wdWJsaXNoZXJkYXRhIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2lkIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvcGVydHkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAxIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcG9ydCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDIiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Mi9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9tb2R1bGUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MyIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvamVjdCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT00IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdGFydCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT01IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdG9wIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTYiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT02L1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3B1Ymxpc2hlciIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT03IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Ny9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9jbGFzc3BhdGgiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9OCIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvam5kaUNvbm5lY3Rpb24iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvbmFtZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3ZlcnNpb24iLz4KLSAgPC9uZXN0ZWQ+Ci08L3hzZDJlY29yZTpYU0QyRWNvcmVNYXBwaW5nUm9vdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3MDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcnMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwYjViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNqYm9zcy5qYXIuYXJncwotdGVtcC5mb2xkZXIKLWdlbmVyaWNqYm9zcy5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTdhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjVlZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTU6MDE6NDUgRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzYxYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4yMDUucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogZ2VuZXJpY2pib3NzLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YWU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNlcnZlcnMvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICBnZW5lcmljamJvc3MuamFyICAgICAgICAgICAgICAKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS5nZW5lcmljamJvc3MuamFyID0gc2VydmVycy8KLWphcnMuY29tcGlsZS5vcmRlciA9IGdlbmVyaWNqYm9zcy5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL2J1aWxkZmlsZXMvamJvc3MzMjMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGRmaWxlcy9qYm9zczMyMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmM2I3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGRmaWxlcy9qYm9zczMyMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UuZGVwbG95IiB2YWx1ZT0iMTAiLz4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UudW5kZXBsb3kiIHZhbHVlPSI1Ii8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotICAJCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JCTxzbGVlcCBzZWNvbmRzPSIke3BhdXNlLmRlcGxveX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVqYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCSAgICAgICAJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC96aXBmaWxlc2V0PgotCQk8L2phcj4KLSAgCQk8bW92ZSBmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciIgdG9kaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfSIvPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZS5kZXBsb3l9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS5lYXIiPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPHNsZWVwIHNlY29uZHM9IiR7cGF1c2UuZGVwbG95fSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiIGZhaWxvbmVycm9yPSJmYWxzZSI+IDwvZGVsZXRlPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZS51bmRlcGxveX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiBmYWlsb25lcnJvcj0iZmFsc2UiPiA8L2RlbGV0ZT4KLQkJPHNsZWVwIHNlY29uZHM9IiR7cGF1c2UudW5kZXBsb3l9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTxkZWxldGUgZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciIgZmFpbG9uZXJyb3I9ImZhbHNlIj4gPC9kZWxldGU+Ci0JCTxzbGVlcCBzZWNvbmRzPSIke3BhdXNlLnVuZGVwbG95fSIvPgotCTwvdGFyZ2V0PgkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9pY29ucy9vYmoxNi9qYm9zcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9pY29ucy9vYmoxNi9qYm9zcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvaWNvbnMvb2JqMTYvamJvc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljYTViOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT0gSkJvc3MgR2VuZXJpYyBzZXJ2ZXIgZGVmaW5pdGlvbnMgCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIEpCb3NzIHNlcnZlciBkZWZpbml0aW9ucyAKLQotCi0jID09PT09PT09PT09PSBqYm9zczMyMyA9PT09PT09PT09PT09PT09PT09PQotamJvc3NDYXRlZ29yeT1KQm9zcwotamJvc3MzMjNydW50aW1lVHlwZU5hbWU9SkJvc3MgdjMuMi4zCi1qYm9zczMyM3J1bnRpbWVUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS4zIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczMyM3NlcnZlclR5cGVOYW1lPUpCb3NzIHYzLjIuMwotamJvc3MzMjNzZXJ2ZXJUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS4zIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczRydW50aW1lVHlwZU5hbWU9SkJvc3MgdjQuMAotamJvc3M0cnVudGltZVR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNHNlcnZlclR5cGVOYW1lPUpCb3NzIHY0LjAKLWpib3NzNHNlcnZlclR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNDJydW50aW1lVHlwZU5hbWU9SkJvc3MgdjQuMgotamJvc3M0MnJ1bnRpbWVUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS40IGFuZCA1LjAgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNDJzZXJ2ZXJUeXBlTmFtZT1KQm9zcyB2NC4yCi1qYm9zczQyc2VydmVyVHlwZURlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIDEuNCBhbmQgNS4wIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczVydW50aW1lVHlwZU5hbWU9SkJvc3MgdjUuMAotamJvc3M1cnVudGltZVR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSA1IG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczVzZXJ2ZXJUeXBlTmFtZT1KQm9zcyB2NS4wCi1qYm9zczVzZXJ2ZXJUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEpFRSA1IG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi0jID09PT09PT09PT09PT09IHNlcnZlcmRlZiB0cmFuc2xhdGlvbnMgPT09PT09PT09PT09PT09PQotQXBwbGljYXRpb25TZXJ2ZXJEaXJlY3Rvcnk9QXBwbGljYXRpb24gJlNlcnZlciBEaXJlY3Rvcnk6Ci1zZXJ2ZXJBZGRyZXNzPUEmZGRyZXNzOgotc2VydmVyUG9ydD0mUG9ydDoKLWpuZGlQb3J0PSZKTkRJIFBvcnQ6Ci1qYm9zczMyM3NlcnZlckNvbmZpZz1TZXJ2ZXIgQ28mbmZpZ3VyYXRpb246Ci1zZXJ2ZXJjbGFzc1BhdGg9JkNsYXNzcGF0aCBWYXJpYWJsZToKLXNlcnZlck5hbWU9U2VyJnZlciBOYW1lOgotdXNlcm5hbWU9VXNlJnIgTmFtZToKLXBhc3N3b3JkPVBhc3Mmd29yZDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE0M2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotCSAgICA8cnVudGltZVR5cGUKLQkgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzMzIzIgotCSAgICAgICBuYW1lPSIlamJvc3MzMjNydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3MzMjNydW50aW1lVHlwZURlc2NyaXB0aW9uIgotCSAgICAgICB2ZW5kb3I9IiVqYm9zc0NhdGVnb3J5IgotCSAgICAgICB2ZXJzaW9uPSIzLjIuMyIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCIvPgotCSAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC5lYXIiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMiwgMS4zIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0JICAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotCSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLQkgICAgPC9ydW50aW1lVHlwZT4KLQkgICAgCi0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0IgotCSAgICAgICBuYW1lPSIlamJvc3M0cnVudGltZVR5cGVOYW1lIgotCSAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzNHJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgIHZlbmRvcj0iJWpib3NzQ2F0ZWdvcnkiCi0JICAgICAgIHZlcnNpb249IjQuMCIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCIvPgotCSAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC5lamIiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMSwgMi4wLCAyLjEiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40Ii8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICA8L3J1bnRpbWVUeXBlPgotCi0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLQkgICAgICAgbmFtZT0iJWpib3NzNDJydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M0MnJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgIHZlbmRvcj0iJWpib3NzQ2F0ZWdvcnkiCi0JICAgICAgIHZlcnNpb249IjQuMiIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCwgMi41Ii8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmVqYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4xLCAyLjAsIDIuMSwgMy4wIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmVhciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4yLCAxLjMsIDEuNCwgNS4wIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICA8L3J1bnRpbWVUeXBlPgotCSAgICAKLQkgICAgPHJ1bnRpbWVUeXBlCi0JICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczUiCi0JICAgICAgIG5hbWU9IiVqYm9zczVydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M1cnVudGltZVR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgdmVuZG9yPSIlamJvc3NDYXRlZ29yeSIKLQkgICAgICAgdmVyc2lvbj0iNS4wIgotCSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotCSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40LCAyLjUiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40LCA1LjAiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuY29ubmVjdG9yIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0JICAgIDwvcnVudGltZVR5cGU+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0JICAgICA8c2VydmVyVHlwZQotCSAgICAgICAgICAgcnVudGltZT0idHJ1ZSIKLQkgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotCSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczMyMyIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0JICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzMzIzc2VydmVyVHlwZURlc2NyaXB0aW9uIgotCSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotCSAgICAgICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIiCi0JICAgICAgICAgICBuYW1lPSIlamJvc3MzMjNzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+Ci0JICAgICAgICAgIAotCSAgICAgPC9zZXJ2ZXJUeXBlPgotCSAgICAgPHNlcnZlclR5cGUKLQkgICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0JICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIKLQkgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M0IgotCSAgICAgICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotCSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0JICAgICAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczQiCi0JICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzNHNlcnZlclR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIgotCSAgICAgICAgICAgbmFtZT0iJWpib3NzNHNlcnZlclR5cGVOYW1lIgotCSAgICAgICAgICAgc3RhcnRUaW1lb3V0PSI1MDAwMCIKLQkJICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLQkgICAgICAgICAgIGhhc0NvbmZpZ3VyYXRpb249ImZhbHNlIgotCSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1Zyxwcm9maWxlIj4gICAgICAgIAotCSAgICAgPC9zZXJ2ZXJUeXBlPgotCSAgICAgPHNlcnZlclR5cGUKLQkgICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0JICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIKLQkgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M0MiIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLQkgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M0MnNlcnZlclR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIgotCSAgICAgICAgICAgbmFtZT0iJWpib3NzNDJzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+ICAgICAgICAKLQkgICAgIDwvc2VydmVyVHlwZT4KLQkgICAgIDxzZXJ2ZXJUeXBlCi0JICAgICAgICAgICBydW50aW1lPSJ0cnVlIgotCSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0JICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNSIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M1IgotCSAgICAgICAgICAgZGVzY3JpcHRpb249IiVqYm9zczVzZXJ2ZXJUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0JICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLQkgICAgICAgICAgIG5hbWU9IiVqYm9zczVzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+ICAgICAgICAKLQkgICAgIDwvc2VydmVyVHlwZT4KLQkgICAgIAotCTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgIAotCSAgICAgPGZyYWdtZW50Ci0JICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczMyMyIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVyIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNCIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNDIiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgIAotCSAgICAgPGZyYWdtZW50Ci0JICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczQyIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M1IgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50Ii8+ICAgICAgICAgICAKLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXIiCi0JICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M1IgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLQk8L2V4dGVuc2lvbj7CtAotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLQkJIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzMzIzIi8+Ci0JICAgICA8aW1hZ2UKLQkgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotCSAgICAgICAgIGljb249Imljb25zL29iajE2L2pib3NzLmdpZiIKLQkgICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MzMjMiLz4KLQkgICAgIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNCIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNDIiLz4KLQkgICAgIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNSIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNSIvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZVRhcmdldCIKLSAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzKiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc2VydmVyZGVmaW5pdGlvbiI+Ci0JCTxzZXJ2ZXJkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczMyMyIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzMzIzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4gICAKLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNDIiIGRlZmluaXRpb25maWxlPSIvc2VydmVycy9qYm9zczQyLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4gICAKLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNSIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzNS5zZXJ2ZXJkZWYiPgotCQk8L3NlcnZlcmRlZmluaXRpb24+ICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgIHZlcnNpb249IjMuMi4zIi8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIKLSAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgIHZlcnNpb249IjQuMiIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgdmVyc2lvbj0iNS4wIi8+Ci0KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb249IjEuMSwyLjAsMi4xIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAsMS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gICAgCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgICAgdmVyc2lvbj0iNC4yIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEsMy4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40LDUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgICAKLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSwzLjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lYXIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCw1LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAsMS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIi8+ICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPiAgCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSIzLjIuMyIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczQiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIKLSAgICAgIHZlcnNpb249IjQuMiIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczUiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zcy5zZXJ2ZXJkZWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyOTg0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRuczpTZXJ2ZXJSdW50aW1lCi0JeG1sbnM6dG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIFNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCAiCi0JbmFtZT0iSkJPU1MgNC4wIiB2ZXJzaW9uPSJ2NC4wIj4KLTxwcm9wZXJ0eSBpZD0ic2VydmVyUm9vdERpcmVjdG9yeSIKLQlsYWJlbD0iJUFwcGxpY2F0aW9uU2VydmVyRGlyZWN0b3J5IgotCXR5cGU9ImRpcmVjdG9yeSIKLQljb250ZXh0PSJydW50aW1lIgotCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L2FwcHNlcnZlcnMvamJvc3MiIC8+Ci08cHJvcGVydHkgaWQ9InNlcnZlckFkZHJlc3MiCi0JbGFiZWw9IiVzZXJ2ZXJBZGRyZXNzIgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTI3LjAuMC4xIiAvPgotPHByb3BlcnR5IGlkPSJwb3J0IgotCWxhYmVsPSIlc2VydmVyUG9ydCIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjgwODAiIC8+Ci08cHJvcGVydHkgaWQ9ImpuZGlQb3J0IgotCWxhYmVsPSIlam5kaVBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSIxMDk5IiAvPgkKLTxwcm9wZXJ0eSBpZD0ic2VydmVyQ29uZmlnIgotCWxhYmVsPSIlamJvc3MzMjNzZXJ2ZXJDb25maWciCi0JdHlwZT0iY29tYm8iCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9ImRlZmF1bHQsYWxsLG1pbmltYWwsb3RoZXIgLSB0eXBlIHlvdXIgb3duIGhlcmUiIC8+Ci0KLQk8cG9ydD4KLQkJPG5vPiR7cG9ydH08L25vPgotCQk8bmFtZT5IdHRwPC9uYW1lPgotCQk8cHJvdG9jb2w+aHR0cDwvcHJvdG9jb2w+Ci0JPC9wb3J0PgotCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVqYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnByb2plY3Q8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3Byb2plY3Q+Ci0JCi0JPHN0YXJ0PgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5NYWluPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tYyAke3NlcnZlckNvbmZpZ308L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+LURwcm9ncmFtLm5hbWU9cnVuLmJhdCAtRGphdmEuZW5kb3JzZWQuZGlycz0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vLi4vbGliL2VuZG9yc2VkIiAtWG1zMTI4bSAtWG14NTEybTwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5TaHV0ZG93bjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LVM8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+LURqYm9zcy5ib290LmxvYWRlci5uYW1lPXNodXRkb3duLmJhdDwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnNodXRkb3duPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvamJvc3MzMjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9Impib3NzIiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluL3J1bi5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aCBpZD0iamJvc3Muc2h1dGRvd24iID4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vc2h1dGRvd24uamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MucHJvamVjdCIgPgotCQkKLQkJCQotCSAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0iPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJjbGllbnQvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2xpYi8qLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgRUpCMyBpcyBub3QgdGhlcmUgNC4wLnggNC4yIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvamJvc3MtYW9wLWpkazUwLmRlcGxveWVyLyouamFyIiAvPgotCQkgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvZWpiMy5kZXBsb3llci8qLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3MzMjMuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zczMyMy5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTViMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zczMyMy5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDMuMi4zIiB2ZXJzaW9uPSJ2My4yLjMiPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJSb290RGlyZWN0b3J5IgotCWxhYmVsPSIlQXBwbGljYXRpb25TZXJ2ZXJEaXJlY3RvcnkiCi0JdHlwZT0iZGlyZWN0b3J5IgotCWNvbnRleHQ9InJ1bnRpbWUiCi0JZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3QvYXBwc2VydmVycy9qYm9zcy0zLjIuMyIgLz4KLTxwcm9wZXJ0eSBpZD0ic2VydmVyQWRkcmVzcyIKLQlsYWJlbD0iJXNlcnZlckFkZHJlc3MiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSIxMjcuMC4wLjEiIC8+Ci08cHJvcGVydHkgaWQ9InBvcnQiCi0JbGFiZWw9IiVzZXJ2ZXJQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iODA4MCIgLz4KLTxwcm9wZXJ0eSBpZD0iam5kaVBvcnQiCi0JbGFiZWw9IiVqbmRpUG9ydCIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEwOTkiIC8+CQotCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9InNlbGVjdCIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iZGVmYXVsdCxhbGwsbWluaW1hbCIgLz4KLQotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPHByb2plY3Q+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3MucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+b3JnLmpib3NzLk1haW48L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1jICR7c2VydmVyQ29uZmlnfTwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1TPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvamJvc3MzMjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcyIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9ydW4uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9zaHV0ZG93bi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIvamJvc3MtYm9vdC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLXN5c3RlbS5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLWpteC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLWNvbW1vbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2NvbmN1cnJlbnQuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYm9zcy5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2pucHNlcnZlci5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2pwbC1wYXR0ZXJuLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvZGVmYXVsdC9saWIvanBsLXV0aWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYm9zcy10cmFuc2FjdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2JjZWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2xpYi9qZG9tLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIveGVyY2VzSW1wbC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL3htbC1hcGlzLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIvZ251LXJlZ2V4cC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2dldG9wdC5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5wcm9qZWN0IiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvZGVmYXVsdC9saWIvYWN0aXZhdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL21haWwuamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M0Mi5zZXJ2ZXJkZWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzNDIuc2VydmVyZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk0Mjc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M0Mi5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDQuMiIgdmVyc2lvbj0idjQuMiI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJqbmRpUG9ydCIKLQlsYWJlbD0iJWpuZGlQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTA5OSIgLz4JCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9ImNvbWJvIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSJkZWZhdWx0LGFsbCxtaW5pbWFsLG90aGVyIC0gdHlwZSB5b3VyIG93biBoZXJlIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5wcm9qZWN0PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuTWFpbjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJHtzZXJ2ZXJDb25maWd9PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EcHJvZ3JhbS5uYW1lPXJ1bi5iYXQgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluLy4uL2xpYi9lbmRvcnNlZCIgLVhtczEyOG0gLVhteDUxMm08L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1TPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EamJvc3MuYm9vdC5sb2FkZXIubmFtZT1zaHV0ZG93bi5iYXQ8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5zaHV0ZG93bjwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL2pib3NzMzIzLnhtbDwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkKLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcyIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9ydW4uamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCTxjbGFzc3BhdGggaWQ9Impib3NzLnNodXRkb3duIiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluL3NodXRkb3duLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQotCTxjbGFzc3BhdGggaWQ9Impib3NzLnByb2plY3QiID4KLQkJCi0JCQkKLQkgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9Ij4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0iY2xpZW50LyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvKi5qYXIiIC8+Ci0KLQkgICAgICAgPCEtLSBKU0YgTGlicmFyaWVzIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvamJvc3Mtd2ViLmRlcGxveWVyL2pzZi1saWJzLyouamFyIiAvPgotCSAgICAgICAKLQkgICAgICAgPCEtLSBUaGlzIHdpbGwgYmUgaWdub3JlZCBpZiBFSkIzIGlzIG5vdCB0aGVyZSA0LjAueCA0LjIgLS0+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveS9qYm9zcy1hb3AtamRrNTAuZGVwbG95ZXIvKi5qYXIiIC8+Ci0JCSAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveS9lamIzLmRlcGxveWVyLyouamFyIiAvPgotCi0JICAgICAgIDwhLS0gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgRUpCMyBpcyBub3QgdGhlcmUgNS4wIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveWVycy9qYm9zc3dlYi5kZXBsb3llci8qLmphciIgLz4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvZGVwbG95ZXJzL2pib3Nzd2ViLmRlcGxveWVyL2pzZi1saWJzLyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3MtYW9wLWpib3NzNS5kZXBsb3llci8qLmphciIgLz4KLQkJICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvZGVwbG95ZXJzL2VqYjMuZGVwbG95ZXIvamJvc3MtYW5ub3RhdGlvbnMtZWpiMy5qYXIiIC8+Ci0JICAgICAgIAkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M1LnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M1LnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3MDJiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzNS5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDUuMCIgdmVyc2lvbj0idjUuMCI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJqbmRpUG9ydCIKLQlsYWJlbD0iJWpuZGlQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTA5OSIgLz4JCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9ImNvbWJvIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSJkZWZhdWx0LGFsbCxtaW5pbWFsLG90aGVyIC0gdHlwZSB5b3VyIG93biBoZXJlIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5wcm9qZWN0PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuTWFpbjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJHtzZXJ2ZXJDb25maWd9PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EcHJvZ3JhbS5uYW1lPXJ1bi5iYXQgLVhtczEyOG0gLVhteDUxMm0gIC1YWDpNYXhQZXJtU2l6ZT0yNTZtPC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3M8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0YXJ0PgotCi0JPHN0b3A+Ci0JCTxtYWluQ2xhc3M+b3JnLmpib3NzLlNodXRkb3duPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tUzwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz4tRGpib3NzLmJvb3QubG9hZGVyLm5hbWU9c2h1dGRvd24uYmF0PC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3Muc2h1dGRvd248L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0b3A+Ci0JPHB1Ymxpc2hlciBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciI+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPmJ1aWxkLmZpbGU8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT4vYnVpbGRmaWxlcy9qYm9zczMyMy54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCi0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkJCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MiID4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vcnVuLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5zaHV0ZG93biIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9zaHV0ZG93bi5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5wcm9qZWN0IiA+Ci0JCQotCQkJCi0JICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fSI+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9ImNsaWVudC8qLmphciIgLz4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvbGliLyouamFyIiAvPgotCSAgICAgICAJICAgICAgIAotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3N3ZWIuZGVwbG95ZXIvanNmLWxpYnMvKi5qYXIiIC8+CSAgICAgICAKLQotCSAgICAgICA8IS0tIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIEVKQjMgaXMgbm90IHRoZXJlIDUuMCAtLT4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ibGliLyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3N3ZWIuZGVwbG95ZXIvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveWVycy9qYm9zcy1hb3AtamJvc3M1LmRlcGxveWVyLyouamFyIiAvPgotCQkgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvZWpiMy5kZXBsb3llci9qYm9zcy1hbm5vdGF0aW9ucy1lamIzLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3MDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcnMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkY2FlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNqb25hcy5qYXIuYXJncwotZ2VuZXJpY2pvbmFzLmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDMwMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTY2ZmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6NDM6NDggRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzlkMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMjA1LnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IGdlbmVyaWNqb25hcy5qYXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWE5ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2VydmVycy8sXAotICAgICAgICAgICAgICAgYnVpbGRmaWxlcy8sXAotICAgICAgICAgICAgICAgZ2VuZXJpY2pvbmFzLmphcgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gZ2VuZXJpY2pvbmFzLmphcgotc291cmNlLmdlbmVyaWNqb25hcy5qYXIgPSBzZXJ2ZXJzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGRmaWxlcy9qb25hcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9idWlsZGZpbGVzL2pvbmFzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ODJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9idWlsZGZpbGVzL2pvbmFzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJqb25hcy5yb290IiB2YWx1ZT0iJHtqb25hc1Jvb3R9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImpvbmFzLmJhc2UiIHZhbHVlPSIke2pvbmFzQmFzZX0iLz4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UiIHZhbHVlPSIxMCIvPgotCQotCTxwYXRoIGlkPSJiYXNlLmNsYXNzcGF0aCI+Ci0JICAgIDwhLS0gQ0xBU1NQQVRIIGlzIGFkZGVkIGZvciBydW50ZXN0IHRhcmdldCAtLT4KLQkgICAgPGZpbGVzZXQgZGlyPSIke2pvbmFzLnJvb3R9L2xpYiI+Ci0JICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLQkgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9vd19qb25hc19ib290c3RyYXAuamFyIi8+Ci0JICAgIDwvZmlsZXNldD4KLQk8L3BhdGg+CQkJCQotCTxwYXRoIGlkPSJ0b29scGF0aCI+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke2pvbmFzLmJhc2V9L2NvbmY7JHtqb25hcy5yb290fS9saWIvY29tbW9uL293X2pvbmFzX2Jvb3RzdHJhcC5qYXIiIC8+Ci0JPC9wYXRoPgotCi0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS53ZWIiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImpvbmFzLXdlYi11bmRlcGxveSIgLz4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtd2ViLWRlcGxveSIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVqYiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtZWpiLXVuZGVwbG95IiAvPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJqb25hcy1lamItZGVwbG95IiAvPgotCTwvdGFyZ2V0PgotCQotCQotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiA8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+CQotCi0JPHRhcmdldCBuYW1lPSJqb25hcy1lamItZGVwbG95IiBkZXBlbmRzPSJqb25hcy1qYXIiPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuc2VydmVyLkJvb3RzdHJhcCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9InRvb2xwYXRoIj4KLQkJCTxhcmcgdmFsdWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuYWRtLkpvbmFzQWRtaW4iIC8+Ci0JCQk8YXJnIHZhbHVlPSItYSIgLz4KLQkJCTxhcmcgdmFsdWU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGluc3RhbGwucm9vdD0ke2pvbmFzLnJvb3R9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5iYXNlPSR7am9uYXMuYmFzZX0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkucG9saWN5PSR7am9uYXMuYmFzZX0vY29uZi9qYXZhLnBvbGljeSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuY2xhc3NwYXRoPSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZheC5ybWkuQ09SQkEuUG9ydGFibGVSZW1vdGVPYmplY3RDbGFzcz1vcmcub2JqZWN0d2ViLmNhcm9sLnJtaS5tdWx0aS5NdWx0aVBST0RlbGVnYXRlIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWw9b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0ke2pvbmFzLmJhc2V9L2NvbmYvamFhcy5jb25maWciIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEucm1pLnNlcnZlci5STUlDbGFzc0xvYWRlclNwaT1vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5SZW1vdGVDbGFzc0xvYWRlclNwaSIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iam9uYXMtZWpiLXVuZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLXIiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iam9uYXMtd2ViLWRlcGxveSI+Ci0KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWEiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImpvbmFzLXdlYi11bmRlcGxveSI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuQm9vdHN0cmFwIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGNsYXNzcGF0aHJlZj0idG9vbHBhdGgiPgotCQkJPGFyZyB2YWx1ZT0ib3JnLm9iamVjdHdlYi5qb25hcy5hZG0uSm9uYXNBZG1pbiIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1yIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EaW5zdGFsbC5yb290PSR7am9uYXMucm9vdH0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmJhc2U9JHtqb25hcy5iYXNlfSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtqb25hcy5iYXNlfS9jb25mL2phdmEucG9saWN5IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5jbGFzc3BhdGg9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5kZWZhdWx0LmNsYXNzbG9hZGVyPXRydWUiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmF4LnJtaS5DT1JCQS5Qb3J0YWJsZVJlbW90ZU9iamVjdENsYXNzPW9yZy5vYmplY3R3ZWIuY2Fyb2wucm1pLm11bHRpLk11bHRpUFJPRGVsZWdhdGUiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnPSR7am9uYXMuYmFzZX0vY29uZi9qYWFzLmNvbmZpZyIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5ybWkuc2VydmVyLlJNSUNsYXNzTG9hZGVyU3BpPW9yZy5vYmplY3R3ZWIuam9uYXMuc2VydmVyLlJlbW90ZUNsYXNzTG9hZGVyU3BpIiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJqb25hcy1lYXItZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWEiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iam9uYXMtZWFyLXVuZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLXIiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQkKLQkKLQkKLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWFyIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWFyIiBkZXBlbmRzPSItY2hlY2tKMkVFRGVwbG95IiB1bmxlc3M9Im5vdE5lZWRlZCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtZWFyLXVuZGVwbG95IiAvPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJqb25hcy1lYXItZGVwbG95IiAvPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9Ii1jaGVja0oyRUVEZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9Im5vdE5lZWRlZCIgdGFyZ2V0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+Ci0JCQk8c3JjZmlsZXMgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvc3JjZmlsZXM+Ci0JCTwvdXB0b2RhdGU+Ci0JPC90YXJnZXQ+Ci0JCi0JCi0JICA8dGFyZ2V0IG5hbWU9ImpvbmFzLWphciIgID4KLQkJPGRlbGV0ZSBkaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgotCSAgICAgCi0JCTx1bmphciBzcmM9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIGRlc3Q9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIvPiAKLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiBmYWlsb25lcnJvcj0iZmFsc2UiICAvPgotCi0JCSA8dGFza2RlZiBuYW1lPSJqb25hc0VqYkpqYXIiCi0JCSAgICBjbGFzc25hbWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuYW50LkVqYkphciIKLQkJICAgIGNsYXNzcGF0aHJlZj0iYmFzZS5jbGFzc3BhdGgiIC8+Ci0KLQkgIAk8am9uYXNFamJKamFyIGJhc2VqYXJuYW1lPSIke21vZHVsZS5uYW1lfSIKLQkJICAgIHNyY2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzIgotCQkgICAgZGVzY3JpcHRvcmRpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzL01FVEEtSU5GIiAKLQkJICAgIGRlcGVuZGVuY3k9ImZ1bGwiID4KLQkgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9lamItamFyLnhtbCIvPgotCSAgICAgIDxkdGQgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotCQkgICBsb2NhdGlvbj0iJHtqb25hcy5yb290fS94bWwvZWpiLWphcl8yXzAuZHRkIiAvPgotCSAgICAgIDxzdXBwb3J0IGRpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzIj4KLQkJICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL01BTklGRVNULk1GIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL2VqYi1qYXIueG1sIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL2pvbmFzLWVqYi1qYXIueG1sIi8+Ci0JICAgICAgPC9zdXBwb3J0PgotCSAgICAgIDxqb25hcyBkZXN0ZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iCi0JICAgICAgICAgY2xhc3NwYXRoPSIke2Jhc2UuY2xhc3NwYXRofToke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX1fam9uYXMiIAotCQkgICAgIGpvbmFzUm9vdD0iJHtqb25hcy5yb290fSIgCi0JCSAgICAgbWFwcGVybmFtZXM9IiIKLQkgICAgICAgICBwcm90b2NvbHM9ImpybXAsamVyZW1pZSxpaW9wIgotCQkgICAgIGtlZXBnZW5lcmF0ZWQ9ImZhbHNlIiAvPgotCSAgICA8L2pvbmFzRWpiSmphcj4KLQkJPGRlbGV0ZSBkaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPiAKLQkgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9pY29ucy9vYmoxNi9qb25hcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9pY29ucy9vYmoxNi9qb25hcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvaWNvbnMvb2JqMTYvam9uYXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1NDY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDg0YjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIj4KLSAgIAotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiCi0gICAgICAgbmFtZT0iJWpvbmFzNHJ1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJWpvbmFzNHJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlam9uYXNDYXRlZ29yeSIKLSAgICAgICB2ZXJzaW9uPSI0IgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZSIKLSAgICAgICA+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xIi8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5lYXIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4yLCAxLjMsIDEuNCIvPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbnM9IjEuMCwgMS41Ii8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotICAgIAotCTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMiPgotICAgICA8c2VydmVyVHlwZQotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSIlam9uYXM0c2VydmVyVHlwZURlc2NyaXB0aW9uIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hczQiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgICAgIG5hbWU9IiVqb25hczRzZXJ2ZXJUeXBlTmFtZSIKLSAgICAgICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXM0IgotICAgICAgICAgICBzdGFydEJlZm9yZVB1Ymxpc2g9InRydWUiCi0gICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0gICAgICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiPgotICAgICA8L3NlcnZlclR5cGU+ICAgIAotICAgIAotCTwvZXh0ZW5zaW9uPgotPCEtLSBVSSBDb21wb25lbnRzLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotCSA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0gICAgIDxmcmFnbWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzNCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLSAgPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qb25hcy5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiLz4KLSAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvam9uYXMuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzNCIvPgotCTwvZXh0ZW5zaW9uPgotCi08IS0tIERlZmluZSBDbGFzc3BhdGggcHJvdmlkZXIgZm9yIGFsbCBnZW5lcmljcyAtLT4gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KLSAgICAgPHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWVUYXJnZXQiCi0gICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS4qIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gU2VydmVyIHR5cGUgZGVmaW5pdGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzNCIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pvbmFzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4KLSAgPC9leHRlbnNpb24+Ci0KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+ICAgIAotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIgotICAgICAgIHZlcnNpb249IjQuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIgotICAgICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHBhdGg9Imljb25zL29iajE2L2pvbmFzLmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MiPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHZlcnNpb249IjQuMCIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9zZXJ2ZXJzL2pvbmFzLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3NlcnZlcnMvam9uYXMuc2VydmVyZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZkOGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3NlcnZlcnMvam9uYXMuc2VydmVyZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dG5zOlNlcnZlclJ1bnRpbWUKLQl4bWxuczp0bnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24gU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkICIKLQluYW1lPSJKT25BUyA0LngiIHZlcnNpb249InY0LngiPgotCTxwcm9wZXJ0eSBpZD0iam9uYXNSb290IgotCQlsYWJlbD0iJWpvbmFzUm9vdCIKLQkJdHlwZT0iZGlyZWN0b3J5IgotCQljb250ZXh0PSJydW50aW1lIgotCQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9KT25BUy00LngiIC8+Ci0JPHByb3BlcnR5IGlkPSJqb25hc0Jhc2UiCi0JCWxhYmVsPSIlam9uYXNCYXNlIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InJ1bnRpbWUiCi0JCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L0pPbkFTLTQueCIgLz4KLQk8cHJvcGVydHkgaWQ9InNlcnZlckFkZHJlc3MiCi0JCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLQk8cHJvcGVydHkgaWQ9InBvcnQiCi0JCWxhYmVsPSIlc2VydmVyUG9ydCIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IjkwMDAiIC8+Ci0JPHByb3BlcnR5IGlkPSJwcm90b2NvbHMiCi0JCWxhYmVsPSIlam9uYXNFamJQcm90b2NvbHMiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJqcm1wIiAvPgotCTxwcm9wZXJ0eSBpZD0ibWFwcGVybmFtZXMiCi0JCWxhYmVsPSIlam9uYXNtYXBwZXJuYW1lcyIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IiIgLz4KLQotCTxwb3J0PgotCQk8bm8+JHtwb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3Qud2ViPC90eXBlPgotCQk8cHVibGlzaERpcj4ke2pvbmFzQmFzZX0vd2ViYXBwcy9hdXRvbG9hZDwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke2pvbmFzQmFzZX0vZWpiamFycy9hdXRvbG9hZDwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtqb25hc0Jhc2V9L2FwcHMvYXV0b2xvYWQ8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPHByb2plY3Q+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+am9uYXMucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuQm9vdHN0cmFwPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7am9uYXNSb290fTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuU2VydmVyPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EaW5zdGFsbC5yb290PSIke2pvbmFzUm9vdH0iIC1Eam9uYXMuYmFzZT0iJHtqb25hc0Jhc2V9IiAtRGphdmEuc2VjdXJpdHkucG9saWN5PSIke2pvbmFzUm9vdH0vY29uZi9qYXZhLnBvbGljeSIgLURqb25hcy5jbGFzc3BhdGg9IC1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIC1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSAtRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IC1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0iJHtqb25hc1Jvb3R9L2NvbmYvamFhcy5jb25maWciICAtRGphdmEuZW5kb3JzZWQuZGlycz0iJHtqb25hc1Jvb3R9L2xpYi9lbmRvcnNlZCIgLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGk8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qb25hczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXA8L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtqb25hc1Jvb3R9PC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz5vcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIC1zPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EaW5zdGFsbC5yb290PSR7am9uYXNSb290fSAtRGpvbmFzLmJhc2U9JHtqb25hc0Jhc2V9IC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtqb25hc1Jvb3R9L2NvbmYvamF2YS5wb2xpY3kgLURqb25hcy5jbGFzc3BhdGg9IC1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIC1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSAtRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IC1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0ke2pvbmFzUm9vdH0vY29uZi9qYWFzLmNvbmZpZyAgLURqYXZhLmVuZG9yc2VkLmRpcnM9JHtqb25hc1Jvb3R9L2xpYi9lbmRvcnNlZCAtRGphdmEucm1pLnNlcnZlci5STUlDbGFzc0xvYWRlclNwaT1vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5SZW1vdGVDbGFzc0xvYWRlclNwaTwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpvbmFzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvam9uYXMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9ImpvbmFzIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb24vb3dfam9uYXNfYm9vdHN0cmFwLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2NvbmYiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqb25hcy5wcm9qZWN0Ij4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb24vb3dfam9uYXNfYm9vdHN0cmFwLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb25zL2oyZWUvZWpiLTJfMS1hcGkuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke2pvbmFzUm9vdH0vbGliL2NvbW1vbnMvajJlZS9zZXJ2bGV0LTJfNC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7am9uYXNSb290fS9saWIvY29tbW9ucy9qMmVlL2ptcy5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+aWlvcDovLyR7c2VydmVyQWRkcmVzc306MjAwMTwvcHJvdmlkZXJVcmw+Ci0JCTxpbml0aWFsQ29udGV4dEZhY3Rvcnk+b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2NTRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1jb21tb25tb2R1bGVzLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXNfMS4wLjAuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTRiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTkwNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2ZXJzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWU0MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNvYzRqLmphci5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZjI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGo8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViOWJkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6NDI6NTggRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IyZDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGo7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjIwNS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6ICBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogZ2VuZXJpY29jNGouamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwMWIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNlcnZlcnMvLFwKLSAgICAgICAgICAgICAgIGdlbmVyaWNvYzRqLmphcgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotc291cmNlLmdlbmVyaWNvYzRqLmphciA9IHNlcnZlcnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBnZW5lcmljb2M0ai5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUuMTAuMS4zLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUuMTAuMS4zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlNDYwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlLjEwLjEuMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPHByb2plY3QgbmFtZT0icHVibGlzaCIgIGJhc2VkaXI9Ii4iIHhtbG5zOm9yYWNsZT0iYW50bGliOm9yYWNsZSI+Ci0JPGltcG9ydCBmaWxlPSJvcmFjbGUvYW50LW9yYWNsZS54bWwiLz4KLQkJCi0JPCEtLSBPbmx5IGxvY2FsaG9zdCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24gLS0+Ci0JPHByb3BlcnR5IG5hbWU9Im9jNGouaG9zdCIgdmFsdWU9ImxvY2FsaG9zdCIvPiAKLQotCTxwcm9wZXJ0eSBuYW1lPSJkZXBsb3llci51cmkiIHZhbHVlPSJkZXBsb3llcjpvYzRqOiR7b2M0ai5ob3N0fToke29jNGouYWRtaW4ucG9ydH0iIC8+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5za2lwLndlYi5kZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9InNraXAuZGVwbG95IiB0YXJnZXRmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4KLQkJCTxzcmNmaWxlcyBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3NyY2ZpbGVzPgotCQk8L3VwdG9kYXRlPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2hlY2suc2tpcC5lamIuZGVwbG95Ij4KLQkJPHVwdG9kYXRlIHByb3BlcnR5PSJza2lwLmRlcGxveSIgdGFyZ2V0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+Ci0JCQk8c3JjZmlsZXMgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvc3JjZmlsZXM+Ci0JCTwvdXB0b2RhdGU+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5za2lwLmVhci5kZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9InNraXAuZGVwbG95IiB0YXJnZXRmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4KLQkJCTxzcmNmaWxlcyBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC9zcmNmaWxlcz4KLQkJPC91cHRvZGF0ZT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InBhY2thZ2UubW9kdWxlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+Ci0JCQotCTx0YXJnZXQgbmFtZT0icGFja2FnZS5tb2R1bGUuZWpiIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+Ci0JCQotCTx0YXJnZXQgbmFtZT0icGFja2FnZS5tb2R1bGUuZWFyIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUud2ViIiBkZXBlbmRzPSJjaGVjay5za2lwLndlYi5kZXBsb3kiIHVubGVzcz0ic2tpcC5kZXBsb3kiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InBhY2thZ2UubW9kdWxlLndlYiIvPgotCQk8b3JhY2xlOmRlcGxveQotCQkJZGVwbG95ZXJVcmk9IiR7ZGVwbG95ZXIudXJpfSIgCi0JCQl1c2VySWQ9IiR7b2M0ai5hZG1pbi51c2VyfSIKLQkJCXBhc3N3b3JkPSIke29jNGouYWRtaW4ucGFzc3dvcmR9IgotCQkJZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciIKLQkJCWRlcGxveW1lbnROYW1lPSIke21vZHVsZS5uYW1lfSIKLQkJCWNvbnRleHRSb290PSIke21vZHVsZS5uYW1lfSIKLQkJCWJpbmRBbGxXZWJBcHBzPSIke29jNGouYmluZC53ZWJzaXRlfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWpiIiBkZXBlbmRzPSJjaGVjay5za2lwLmVqYi5kZXBsb3kiIHVubGVzcz0ic2tpcC5kZXBsb3kiID4KLQkJPGFudGNhbGwgdGFyZ2V0PSJwYWNrYWdlLm1vZHVsZS5lamIiLz4KLQkJPG9yYWNsZTpkZXBsb3kKLQkJCWRlcGxveWVyVXJpPSIke2RlcGxveWVyLnVyaX0iIAotCQkJdXNlcklkPSIke29jNGouYWRtaW4udXNlcn0iCi0JCQlwYXNzd29yZD0iJHtvYzRqLmFkbWluLnBhc3N3b3JkfSIKLQkJCWZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiCi0JCQlkZXBsb3ltZW50TmFtZT0iJHttb2R1bGUubmFtZX0iCi0JCQliaW5kQWxsV2ViQXBwcz0iJHtvYzRqLmJpbmQud2Vic2l0ZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVhciIgZGVwZW5kcz0iY2hlY2suc2tpcC5lYXIuZGVwbG95IiB1bmxlc3M9InNraXAuZGVwbG95Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJwYWNrYWdlLm1vZHVsZS5lYXIiLz4KLQkJCi0JCTxvcmFjbGU6ZGVwbG95Ci0JCQlkZXBsb3llclVyaT0iJHtkZXBsb3llci51cml9IiAKLQkJCXVzZXJJZD0iJHtvYzRqLmFkbWluLnVzZXJ9IgotCQkJcGFzc3dvcmQ9IiR7b2M0ai5hZG1pbi5wYXNzd29yZH0iCQkJCi0JCQlmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIgotCQkJZGVwbG95bWVudE5hbWU9IiR7bW9kdWxlLm5hbWV9IgotCQkJYmluZEFsbFdlYkFwcHM9IiR7b2M0ai5iaW5kLndlYnNpdGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLm1vZHVsZSI+Ci0JCTxvcmFjbGU6dW5kZXBsb3kKLQkJCWRlcGxveWVyVXJpPSIke2RlcGxveWVyLnVyaX0iCi0JCQl1c2VySWQ9IiR7b2M0ai5hZG1pbi51c2VyfSIKLQkJCXBhc3N3b3JkPSIke29jNGouYWRtaW4ucGFzc3dvcmR9IgotCQkJZGVwbG95bWVudE5hbWU9IiR7bW9kdWxlLm5hbWV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlL2FudC1vcmFjbGUuMTAxM2RwNC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlL2FudC1vcmFjbGUuMTAxM2RwNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTg1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLjEwMTNkcDQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPHByb2plY3QgbmFtZT0iYW50dGFza3MiPgotCi0gICAgPCEtLVRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgdXNlIGJ5IHRoZSBPcmFjbGUgRWNsaXBzZSBXVFAgcGx1Z2luLiAJLS0+Ci0gICAgCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4gICAgIAotCQotICAgIDxwcm9wZXJ0eSBuYW1lPSJKMkVFX0hPTUUiIHZhbHVlPSIke09DNEpfSE9NRX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iT1JBQ0xFX0hPTUUiIHZhbHVlPSIke09DNEpfSE9NRX0vLi4vLi4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iSkFWQV9IT01FIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Ik9KREtfSE9NRSIgdmFsdWU9IiR7T1JBQ0xFX0hPTUV9L2pkayIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJUT1BMSU5LX0hPTUUiIHZhbHVlPSIke2Vudi5UT1BMSU5LX0hPTUV9Ii8+Ci0KLSAgICA8IS0tIElmIHlvdXIgT1MgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgIENvbW1lbnQgb3V0IHRoZSAzIGxpbmVzIGFib3ZlLCBhbmQgdW4tY29tbWVudCB0aGUgMgotICAgICAgICAgYmVsb3cuIC0tPgotICAgIDwhLS0KLSAgICA8cHJvcGVydHkgbmFtZT0iSkFWQV9IT01FIiB2YWx1ZT0iZDpcUHJvZ3JhbSBGaWxlc1xqZGsxMzEiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iT0M0Sl9IT01FIiB2YWx1ZT0iZDpcQXBwc1xPQzRKdjIiLz4KLSAgICAtLT4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIEoyRUUgYmFzZWQgYXBwbGljYXRpb25zIC0tPgotICAgIDxwYXRoIGlkPSJjb21tb24uajJlZS5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRiYy9saWIvY2xhc3NlczEyLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9vYzRqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam5kaS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2VqYi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL3NlcnZsZXQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRrL2pyZS9saWIvZXh0L2p0YS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pkYmMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi9idWlsZCIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam1zLmphciIvPgotICAgIDwvcGF0aD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9uLmoyZWUuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi5qMmVlLmNsYXNzLnBhdGgiLz4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIHdlYnNlcnZpY2VzIGFwcGxpY2F0aW9ucy4gLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9hY3RpdmF0aW9uLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvbWFpbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2h0dHBfY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLSAgICAgICAgCi0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF93c3MuamFyIi8+Ci0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF94bWxzZWMuamFyIi8+Ci0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF9jZXJ0LmphciIvPgotICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29zZHRfY29yZS5qYXIiLz4KLSAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamxpYi9vc2R0X3NhbWwuamFyIi8+Ci0gICAgICAgICAKLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvd3NzZXJ2ZXIuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi93c3NlY3VyaXR5LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9kb200ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvY29tbW9ucy1sb2dnaW5nLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMtYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3NhYWotYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9vcmFzYWFqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi94c2RsaWIuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24ud2Vic2VydmljZXMuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIE9DNEogdGFza3MgY2xhc3NwYXRoLiAgLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9hbnQvbGliL2FudC1vcmFjbGUuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qYXZheDg4LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9hZG1pbl9jbGllbnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L29jNGpjbGllbnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzYS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2JjZWwuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24udGFza3MuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIFRhcmdldCBmb3IgZGlzcGxheWluZyBidWlsZCBpbmZvcm1hdGlvbi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21tb24iPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZE5hbWU6ICR7YW50LnByb2plY3QubmFtZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRIb21lOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkRmlsZTogJHthbnQuZmlsZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRKVk06ICR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGFzayBkZWZpbml0aW9ucyBmb3Igb2M0aiBkZXBsb3ltZW50IHRhc2tzIC0tPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJvcmFjbGUvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JhY2xlIiBsb2FkZXJSZWY9Im9yYWNsZS50YXNrcy5sb2FkZXIiPgotICAgIAk8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tbW9uLnRhc2tzLmNsYXNzLnBhdGh9Ii8+IAotICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L3Rhc2tkZWY+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUvYW50LW9yYWNsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzgwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTxwcm9qZWN0IG5hbWU9ImFudHRhc2tzIj4KLQotICAgIDwhLS1UaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIHVzZSBieSB0aGUgT3JhY2xlIEVjbGlwc2UgV1RQIHBsdWdpbi4gCS0tPiAgICAKLSAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPiAgICAgCi0KLSAgICA8cHJvcGVydHkgbmFtZT0iSjJFRV9IT01FIiB2YWx1ZT0iJHtPQzRKX0hPTUV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Ik9SQUNMRV9IT01FIiB2YWx1ZT0iJHtPQzRKX0hPTUV9Ly4uLy4uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkpBVkFfSE9NRSIgdmFsdWU9IiR7amF2YS5ob21lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJPSkRLX0hPTUUiIHZhbHVlPSIke09SQUNMRV9IT01FfS9qZGsiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iVE9QTElOS19IT01FIiB2YWx1ZT0iJHtlbnYuVE9QTElOS19IT01FfSIvPgotCQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIEoyRUUgYmFzZWQgYXBwbGljYXRpb25zIC0tPgotICAgIDxwYXRoIGlkPSJjb21tb24uajJlZS5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRiYy9saWIvb2pkYmMxNGRtcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vb2M0ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2VqYi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL3NlcnZsZXQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qdGEuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qbXMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qYXZheDg4LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvamF2YXg3Ny5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pteHJpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam14X3JlbW90ZV9hcGkuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi9idWlsZCIvPgotICAgIDwvcGF0aD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9uLmoyZWUuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi5qMmVlLmNsYXNzLnBhdGgiLz4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIHdlYnNlcnZpY2VzIGFwcGxpY2F0aW9ucy4gLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9hY3RpdmF0aW9uLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvbWFpbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2h0dHBfY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHdzcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHhtbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHNlLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb2pwc2FtbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvd3NzZXJ2ZXIuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi93c3NlY3VyaXR5LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9kb200ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvY29tbW9ucy1sb2dnaW5nLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMtYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3NhYWotYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9vcmFzYWFqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi94c2RsaWIuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24ud2Vic2VydmljZXMuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIE9DNEogdGFza3MgY2xhc3NwYXRoLiAgLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIj4KLSAgICAJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9hbnQvbGliL2FudC1vcmFjbGUuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24udGFza3MuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIFRhcmdldCBmb3IgZGlzcGxheWluZyBidWlsZCBpbmZvcm1hdGlvbi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21tb24iPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZE5hbWU6ICR7YW50LnByb2plY3QubmFtZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRIb21lOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkRmlsZTogJHthbnQuZmlsZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRKVk06ICR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGFzayBkZWZpbml0aW9ucyBmb3Igb2M0aiBkZXBsb3ltZW50IHRhc2tzIC0tPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJvcmFjbGUvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JhY2xlIiBsb2FkZXJSZWY9Im9yYWNsZS50YXNrcy5sb2FkZXIiPgotICAgIAk8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tbW9uLnRhc2tzLmNsYXNzLnBhdGh9Ii8+IAotICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L3Rhc2tkZWY+Ci0KLSAgICA8IS0tIFRhc2sgZGVmaW5pdGlvbnMgZm9yIG9jNGogd2Vic2VydmljZXMgdGFza3MgLS0+Ci0gICAgPHRhc2tkZWYgcmVzb3VyY2U9Im9yYWNsZS9hbnRsaWIueG1sIiB1cmk9ImFudGxpYjpvcmFjbGUiIGxvYWRlclJlZj0ib3JhY2xlLnRhc2tzLmxvYWRlciI+Ci0gICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjb21tb24udGFza3MuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC90YXNrZGVmPgkKLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovaWNvbnMvb2JqMTYvb3JhY2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovaWNvbnMvb2JqMTYvb3JhY2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2ljb25zL29iajE2L29yYWNsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YmM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBPQzRKIEdlbmVyaWMgc2VydmVyIGRlZmluaXRpb25zCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIE9DNEogR2VuZXJpYyBzZXJ2ZXIgZGVmaW5pdGlvbnMKLQotCi0jID09PT09PT09PT09PSBPQzRKIDEwLjEuMyBEUCA0PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IE9yYWNsZSBPQzRKIHYxMC4xLjMgRFA0IEdlbmVyaWMgU2VydmVyIERlZmluaXRpb24gQ29yZSBQbHVnLWluCi1wbHVnaW5EZXNjcmlwdGlvbj1Qcm92aWRlcyBzZXJ2ZXIgZGVmaW5pdGlvbiBmb3IgT3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMgRFA0LlwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5Ci1vcmFjbGVDYXRlZ29yeT1PcmFjbGUKLQotb3JhY2xlLjEwXzFfM1ByZXZpZXcucnVudGltZS5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgMTAuMS4zIERQNAotb3JhY2xlLjEwXzFfM1ByZXZpZXcucnVudGltZS5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiAxMC4xLjMgRFA0IHJ1bnRpbWUKLW9yYWNsZS4xMF8xXzNQcmV2aWV3LnNlcnZlci5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIDEwLjEuMyBEUDQKLW9yYWNsZS4xMF8xXzNQcmV2aWV3LnNlcnZlci5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiBTdGFuZGFsb25lIFNlcnZlciBmb3IgdjEwLjEuMyBcCi1EZXZlbG9wZXIgUHJldmlldyA0IG9uIHRoZSBsb2NhbGhvc3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UKLQotIyA9PT09PT09PT09PT0gT0M0SiAxMC4xLjMgPT09PT09PT09PT09PT09PT09PT0KLW9jNGoucGx1Z2luTmFtZT0gT3JhY2xlIE9DNEogdjEwLjEuMyBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotb2M0ai5wbHVnaW5EZXNjcmlwdGlvbj1Qcm92aWRlcyBzZXJ2ZXIgZGVmaW5pdGlvbiBmb3IgT3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMuXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkKLQotb3JhY2xlLjEwXzFfMy5ydW50aW1lLm5hbWU9T3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMKLW9yYWNsZS4xMF8xXzMucnVudGltZS5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiAxMC4xLjMgcnVudGltZQotb3JhY2xlLjEwXzFfMy5zZXJ2ZXIubmFtZT1PcmFjbGUgT0M0SiBTdGFuZGFsb25lIFNlcnZlciAxMC4xLjMKLW9yYWNsZS4xMF8xXzMuc2VydmVyLmRlc2NyaXB0aW9uPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIGZvciB2MTAuMS4zIFwKLW9uIHRoZSBsb2NhbGhvc3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UKLQotIyA9PT09PT09PT09PT0gT0M0SiAxMC4xLjMuMSA9PT09PT09PT09PT09PT09PT09PQotb2M0ajEwMTMxLnBsdWdpbk5hbWU9IE9yYWNsZSBPQzRKIHYxMC4xLjMubiBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotb2M0ajEwMTMxLnBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIHNlcnZlciBkZWZpbml0aW9uIGZvciBPcmFjbGUgT0M0SiBTdGFuZGFsb25lIDEwLjEuMy4xIGFuZCBhYm92ZS5cCi1Qcm92aWRlcyBiYXNpYyBzZXJ2ZXIgZnVuY3Rpb25hbGl0eQotCi1vcmFjbGUuMTBfMV8zXzEucnVudGltZS5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgMTAuMS4zLm4KLW9yYWNsZS4xMF8xXzNfMS5ydW50aW1lLmRlc2NyaXB0aW9uPU9yYWNsZSBPQzRKIDEwLjEuMy4xIGFuZCBhYm92ZSBydW50aW1lCi1vcmFjbGUuMTBfMV8zXzEuc2VydmVyLm5hbWU9T3JhY2xlIE9DNEogU3RhbmRhbG9uZSBTZXJ2ZXIgMTAuMS4zLm4KLW9yYWNsZS4xMF8xXzNfMS5zZXJ2ZXIuZGVzY3JpcHRpb249T3JhY2xlIE9DNEogU3RhbmRhbG9uZSBTZXJ2ZXIgZm9yIHYxMC4xLjMuMSBhbmQgYWJvdmUgXAotb24gdGhlIGxvY2FsaG9zdCB1c2luZyB0aGUgZGVmYXVsdCBpbnN0YW5jZQotCi0jIFVJIExhYmVscwotbGFiZWwuajJlZS5ob21lPU9yYWNsZSBKMkVFIEhvbWU6Ci1sYWJlbC5hZG1pbi51c2VyPVVzZXI6IAotbGFiZWwuYWRtaW4ucHc9UGFzc3dvcmQ6Ci1sYWJlbC5ob3N0PUFkZHJlc3M6Ci1sYWJlbC5ob3N0LnBvcnQ9QWRtaW4gUG9ydDoKLWxhYmVsLmh0dHAucG9ydD1IVFRQIFBvcnQ6Ci1sYWJlbC53ZWIuc2l0ZT1XZWIgU2l0ZToKLQotIyA9PT09PT09PT09PT09PSBzZXJ2ZXJkZWYgdHJhbnNsYXRpb25zID09PT09PT09PT09PT09PT0KLUFwcGxpY2F0aW9uU2VydmVyRGlyZWN0b3J5PUFwcGxpY2F0aW9uICZTZXJ2ZXIgRGlyZWN0b3J5Ogotc2VydmVyQWRkcmVzcz1BJmRkcmVzczoKLXNlcnZlclBvcnQ9JlBvcnQ6Ci1qbmRpUG9ydD0mSk5ESSBQb3J0Ogotc2VydmVyY2xhc3NQYXRoPSZDbGFzc3BhdGggVmFyaWFibGU6Ci1zZXJ2ZXJOYW1lPVNlciZ2ZXIgTmFtZToKLXVzZXJuYW1lPVVzZSZyIE5hbWU6Ci1wYXNzd29yZD1QYXNzJndvcmQ6Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYTQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIj4KLSAgICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMiCi0gICAgICAgbmFtZT0iJW9yYWNsZS4xMF8xXzMucnVudGltZS5uYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfMy5ydW50aW1lLmRlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJW9yYWNsZUNhdGVnb3J5IgotICAgICAgIHZlcnNpb249IjEwLjEuMyIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40Ii8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPiAKLSAgICAgPC9ydW50aW1lVHlwZT4KLSAgICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMxIgotICAgICAgIG5hbWU9IiVvcmFjbGUuMTBfMV8zXzEucnVudGltZS5uYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfM18xLnJ1bnRpbWUuZGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlb3JhY2xlQ2F0ZWdvcnkiCi0gICAgICAgdmVyc2lvbj0iMTAuMS4zLjEiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40LCAyLjUiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40LCA1LjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+IAotICAgICA8L3J1bnRpbWVUeXBlPiAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotICAgICAgICAgICBkZXNjcmlwdGlvbj0iJW9yYWNsZS4xMF8xXzMuc2VydmVyLmRlc2NyaXB0aW9uIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzIgotICAgICAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1ZyIKLSAgICAgICAgICAgbmFtZT0iJW9yYWNsZS4xMF8xXzMuc2VydmVyLm5hbWUiCi0gICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMiCi0gICAgICAgICAgIHN0YXJ0QmVmb3JlUHVibGlzaD0idHJ1ZSIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiPiAgICAgICAgICAgCi0gICAgICA8L3NlcnZlclR5cGU+IAotICAgICA8c2VydmVyVHlwZQotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfM18xLnNlcnZlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgaGFzQ29uZmlndXJhdGlvbj0iZmFsc2UiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub3JhY2xlMTAxMzEiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnIgotICAgICAgICAgICBuYW1lPSIlb3JhY2xlLjEwXzFfM18xLnNlcnZlci5uYW1lIgotICAgICAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzMSIKLSAgICAgICAgICAgc3RhcnRCZWZvcmVQdWJsaXNoPSJ0cnVlIgotICAgICAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSI+ICAgICAgICAgICAKLSAgICAgIDwvc2VydmVyVHlwZT4gICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVyIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub3JhY2xlMTAxMyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4gICAKLSAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvb3JhY2xlLmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzIiAvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9yYWNsZTEwMTMxIiAvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiLz4gICAgICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyI+ICAgCi0gICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIvPiAgICAgICAgICAgCi0gICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZVRhcmdldEhhbmRsZXIiLz4gICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNlcnZlcmRlZmluaXRpb24iPgotCQk8c2VydmVyZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuc2VydmVyZGVmIj4KLQkJPC9zZXJ2ZXJkZWZpbml0aW9uPgotCQk8c2VydmVyZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiIGRlZmluaXRpb25maWxlPSIvc2VydmVycy9vcmFjbGUuMTAuMS4zLjEuc2VydmVyZGVmIj4KLQkJPC9zZXJ2ZXJkZWZpbml0aW9uPgkJCQkKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSI+Ci0gICAgPC9ydW50aW1lLWNvbXBvbmVudC10eXBlPgotICAgICAgIAotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgIHZlcnNpb249IjEwLjEuMyIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICAgdmVyc2lvbj0iMTAuMS4zLjEiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgICAgICAgLz4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICAgICB2ZXJzaW9uPSIxMC4xLjMiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjUiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgICA8c3VwcG9ydGVkPiAgICAKLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgICAgIHZlcnNpb249IjEwLjEuMy4xIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb249IjEuMSwyLjAsMi4xLDMuMCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS41Ii8+Ci0gICAgPC9zdXBwb3J0ZWQ+ICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgIHBhdGg9Imljb25zL29iajE2L29yYWNsZS5naWYiLz4gICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgICAgICAgIC8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4gICAKLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MiPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgIHZlcnNpb249IjEwLjEuMyIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzMSIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICB2ZXJzaW9uPSIxMC4xLjMuMSIvPiAgICAgIAotICAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLjEuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuMS5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWY5N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuMS5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9Ik9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIHYxMC4xLjMuMSIgdmVyc2lvbj0idjEwLjEuMy4xIj4KLQkKLQk8cHJvcGVydHkgaWQ9Ik9DNEpfSE9NRSIKLQkJbGFiZWwgPSAiJWxhYmVsLmoyZWUuaG9tZSIKLQkJdHlwZT0iZGlyZWN0b3J5IgotCQljb250ZXh0PSJydW50aW1lIgotCQlkZWZhdWx0PSJDOi9vcmFjbGUvT0M0Si0xMC4xLjMuMS9qMmVlL2hvbWUiLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnVzZXIiCi0JCWxhYmVsPSIlbGFiZWwuYWRtaW4udXNlciIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9Im9jNGphZG1pbiIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnBhc3N3b3JkIgotCQlsYWJlbD0iJWxhYmVsLmFkbWluLnB3IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0id2VsY29tZSIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnBvcnQiCi0JCWxhYmVsPSIlbGFiZWwuaG9zdC5wb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iMjM3OTEiIC8+Ci0JCQotCTxwcm9wZXJ0eSBpZD0ib2M0ai5odHRwLnBvcnQiCi0JCWxhYmVsPSIlbGFiZWwuaHR0cC5wb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iODg4OCIgLz4JCi0JCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYmluZC53ZWJzaXRlIgotCQlsYWJlbD0iJWxhYmVsLndlYi5zaXRlIgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iZGVmYXVsdC13ZWItc2l0ZSIgLz4KLQkJCi0JPHBvcnQ+Ci0JCTxubz4ke29jNGouaHR0cC5wb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0JCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtPQzRKX0hPTUV9L2FwcGxpY2F0aW9uczwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke09DNEpfSE9NRX0vYXBwbGljYXRpb25zPC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7T0M0Sl9IT01FfS9hcHBsaWNhdGlvbnM8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgkKLQkKLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5vcmFjbGVfb2M0ajwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQgPgotCQk8bWFpbkNsYXNzPm9yYWNsZS5vYzRqLmxvYWRlci5ib290LkJvb3RTdHJhcDwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke09DNEpfSE9NRX08L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPjwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5vcmFjbGVfYm9vdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkgICAgPG1haW5DbGFzcz5jb20uZXZlcm1pbmQuY2xpZW50Lm9yaW9uLk9jNGpBZG1pbkNvbnNvbGU8L21haW5DbGFzcz4gCi0JICAgIDx3b3JraW5nRGlyZWN0b3J5PiR7T0M0Sl9IT01FfTwvd29ya2luZ0RpcmVjdG9yeT4gIAotCSAgICA8cHJvZ3JhbUFyZ3VtZW50cz5vcm1pOi8vbG9jYWxob3N0OiR7b2M0ai5hZG1pbi5wb3J0fSAke29jNGouYWRtaW4udXNlcn0gJHtvYzRqLmFkbWluLnBhc3N3b3JkfSAtc2h1dGRvd24gPC9wcm9ncmFtQXJndW1lbnRzPgotCSAgICA8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCSAgICA8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9hZG1pbjwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQkKLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL29yYWNsZS4xMC4xLjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5tb2R1bGU8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9hZG1pbiI+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9hZG1pbi5qYXIiLz4KLQk8L2NsYXNzcGF0aD4KLQkKLQk8Y2xhc3NwYXRoIGlkPSJvcmFjbGVfYm9vdCI+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9vYzRqLmphciIvPgotCTwvY2xhc3NwYXRoPgotCQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9vYzRqIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGouamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9vYzRqY2xpZW50LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vb2M0ai1hcGkuamFyIi8+ICAgIAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYWN0aXZhdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9hc20uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYXNtLWF0dHJzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2Nvbm5lY3Rvci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9lamIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvZWpiMzAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamFjYy1hcGkuamFyIi8+CQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2phdmF4NzcuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamF2YXg4OC5qYXIiLz4JCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+IAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvam1zLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pteF9yZW1vdGVfYXBpLmphciIvPgkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvanRhLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL21haWwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvb2M0ai11bnN1cHBvcnRlZC1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvc2VydmxldC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9vanNwLmphciIvPgotICAgICAgICA8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vanNwL2xpYi90YWdsaWIvb2pzcHV0aWwuamFyIi8+CQkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi9saWIveG1scGFyc2VydjIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi90b3BsaW5rL2psaWIvYW50bHIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi90b3BsaW5rL2psaWIvdG9wbGluay5qYXIiLz4JCSAgCQkKLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi90b3BsaW5rLWVzc2VudGlhbHMuamFyIi8+CQkgIAkJCQkKLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3dlYnNlcnZpY2VzL2xpYi93c2RsLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL2pheHItYXBpLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL2pheHJwYy1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvc2Fhai1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvandzLWFwaS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3dlYnNlcnZpY2VzL2xpYi9vcmF3c21ldGFkYXRhLmphciIvPgkJCi0JPC9jbGFzc3BhdGg+Ci0JCi0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+b3JtaTovL2xvY2FsaG9zdDoke29jNGouYWRtaW4ucG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5PmNvbS5ldmVybWluZC5zZXJ2ZXIucm1pLlJNSUluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci0KLTwvdG5zOlNlcnZlclJ1bnRpbWU+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxYzNmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3NlcnZlcnMvb3JhY2xlLjEwLjEuMy5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9Ik9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIHYxMC4xLjMiIHZlcnNpb249InYxMC4xLjMiPgotCQotCTxwcm9wZXJ0eSBpZD0iT0M0Sl9IT01FIgotCQlsYWJlbCA9ICIlbGFiZWwuajJlZS5ob21lIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InJ1bnRpbWUiCi0JCWRlZmF1bHQ9IkM6L29yYWNsZS9PQzRKMTAuMS4zL2oyZWUvaG9tZSIvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4udXNlciIKLQkJbGFiZWw9IiVsYWJlbC5hZG1pbi51c2VyIgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0ib2M0amFkbWluIiAvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4ucGFzc3dvcmQiCi0JCWxhYmVsPSIlbGFiZWwuYWRtaW4ucHciCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJ3ZWxjb21lIiAvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4ucG9ydCIKLQkJbGFiZWw9IiVsYWJlbC5ob3N0LnBvcnQiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSIyMzc5MSIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmh0dHAucG9ydCIKLQkJbGFiZWw9IiVsYWJlbC5odHRwLnBvcnQiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSI4ODg4IiAvPgkKLQkJCQotCTxwcm9wZXJ0eSBpZD0ib2M0ai5iaW5kLndlYnNpdGUiCi0JCWxhYmVsPSIlbGFiZWwud2ViLnNpdGUiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJkZWZhdWx0LXdlYi1zaXRlIiAvPgotCQkKLQk8cG9ydD4KLQkJPG5vPiR7b2M0ai5odHRwLnBvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQkKLQk8bW9kdWxlPgotCQk8dHlwZT5qc3Qud2ViPC90eXBlPgotCQk8cHVibGlzaERpcj4ke09DNEpfSE9NRX0vYXBwbGljYXRpb25zPC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7T0M0Sl9IT01FfS9hcHBsaWNhdGlvbnM8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtPQzRKX0hPTUV9L2FwcGxpY2F0aW9uczwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+CQotCQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9vYzRqPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydCA+Ci0JCTxtYWluQ2xhc3M+b3JhY2xlLm9jNGoubG9hZGVyLmJvb3QuQm9vdFN0cmFwPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7T0M0Sl9IT01FfTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9ib290PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCSAgICA8bWFpbkNsYXNzPmNvbS5ldmVybWluZC5jbGllbnQub3Jpb24uT2M0akFkbWluQ29uc29sZTwvbWFpbkNsYXNzPiAKLQkgICAgPHdvcmtpbmdEaXJlY3Rvcnk+JHtPQzRKX0hPTUV9PC93b3JraW5nRGlyZWN0b3J5PiAgCi0JICAgIDxwcm9ncmFtQXJndW1lbnRzPm9ybWk6Ly9sb2NhbGhvc3Q6JHtvYzRqLmFkbWluLnBvcnR9ICR7b2M0ai5hZG1pbi51c2VyfSAke29jNGouYWRtaW4ucGFzc3dvcmR9IC1zaHV0ZG93biA8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JICAgIDx2bVBhcmFtZXRlcnM+PC92bVBhcmFtZXRlcnM+Ci0JICAgIDxjbGFzc3BhdGhSZWZlcmVuY2U+b3JhY2xlX2FkbWluPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCQotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvb3JhY2xlLjEwLjEuMy54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUubW9kdWxlPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCi0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUubW9kdWxlPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0ib3JhY2xlX2FkbWluIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2FkbWluLmphciIvPgotCTwvY2xhc3NwYXRoPgotCQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9ib290Ij4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGouamFyIi8+Ci0JPC9jbGFzc3BhdGg+Ci0JCi0JPGNsYXNzcGF0aCBpZD0ib3JhY2xlX29jNGoiPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vb2M0ai5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGpjbGllbnQuamFyIi8+ICAgIAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYWN0aXZhdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9hc20uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYXNtLWF0dHJzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2Nvbm5lY3Rvci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9lamIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvZWpiMzAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamFjYy1hcGkuamFyIi8+CQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2phdmF4NzcuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamF2YXg4OC5qYXIiLz4JCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+IAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvam1zLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pteF9yZW1vdGVfYXBpLmphciIvPgkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvanRhLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL21haWwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvb2M0ai11bnN1cHBvcnRlZC1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvc2VydmxldC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi9hbnRsci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi90b3BsaW5rLmphciIvPgkJICAJCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL3NvYXAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvd3NkbC5qYXIiLz4JCQotCTwvY2xhc3NwYXRoPgotCQotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPm9ybWk6Ly9sb2NhbGhvc3Q6JHtvYzRqLmFkbWluLnBvcnR9PC9wcm92aWRlclVybD4KLQkJPGluaXRpYWxDb250ZXh0RmFjdG9yeT5jb20uZXZlcm1pbmQuc2VydmVyLnJtaS5STUlJbml0aWFsQ29udGV4dEZhY3Rvcnk8L2luaXRpYWxDb250ZXh0RmFjdG9yeT4KLQkJPGpuZGlQcm9wZXJ0eT4KLQkJCTxuYW1lPjwvbmFtZT4KLQkJCTx2YWx1ZT48L3ZhbHVlPgotCQk8L2puZGlQcm9wZXJ0eT4KLQk8L2puZGlDb25uZWN0aW9uPgotCi08L3RuczpTZXJ2ZXJSdW50aW1lPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MzlhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotZ2VuZXJpY3VpLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpXzEuMC4wLmphcgotdGVtcC5mb2xkZXIKLWdlbmVyaWN1aXNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTRiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE4Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6MzM6MDYgRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGMxN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNVaVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWVjNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwNWJlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1HZW5lcmljIFNlcnZlciBQbHVnaW4gVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luRGVzY3JpcHRpb249VUkgQ29tcG9uZW50cyBmb3IgdGhlIGdlbmVyaWMgc2VydmVyIHBsdWdpbi4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDBhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkFudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmFudFB1Ymxpc2hlclRlc3RlciIKLSAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiCi0gICAgICAgICAgIHByb3BlcnRpZXM9ImlzQW50UHVibGlzaGVyIgotICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KLSAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSIKLSAgICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UudWkuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlIgotICAgICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvc2VydmVyLmdpZiI+Ci0gICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InJ1biI+Ci0gICAgICA8L2xhdW5jaE1vZGU+Ci0gICAgICA8bGF1bmNoTW9kZQotICAgICAgICAgICAgbW9kZT0iZGVidWciPgotICAgICAgPC9sYXVuY2hNb2RlPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InByb2ZpbGUiPgotICAgICAgPC9sYXVuY2hNb2RlPiAgICAgIAotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InJ1biI+Ci0gICAgICA8L2xhdW5jaE1vZGU+Ci0gICAgICA8bGF1bmNoTW9kZQotICAgICAgICAgICAgbW9kZT0iZGVidWciPgotICAgICAgPC9sYXVuY2hNb2RlPiAgICAgIAotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlU2VjdGlvbnMiPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLnNlcnZlclByb3BlcnRpZXMiCi0gICAgICAgICBvcmRlcj0iMTAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcubGVmdCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyUHJvcGVydGllc0VkaXRvclNlY3Rpb24iPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLmFudEJ1aWRGaWxlU2VsZWN0aW9uIgotICAgICAgICAgb3JkZXI9IjEiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLkFudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24iPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaXNBbnRQdWJsaXNoZXIiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0FudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0FudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGI2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9BbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5TZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVycy5BbnRQdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCXB1YmxpYyBBbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3RlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywKLQkJCU9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSApIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChJU2VydmVyV29ya2luZ0NvcHkpcmVjZWl2ZXI7Ci0JCQlTZXJ2ZXJSdW50aW1lIHJ1bnRpbWVEZWZpbml0aW9uID0gU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHdjLmdldFJ1bnRpbWUoKSk7Ci0JCQlpZiAoIHJ1bnRpbWVEZWZpbml0aW9uICE9IG51bGwgKXsKLQkJCQlMaXN0IGwgPSBydW50aW1lRGVmaW5pdGlvbi5nZXRQdWJsaXNoZXIoKTsKLQkJCQlJdGVyYXRvciByID0gbC5pdGVyYXRvcigpOwotCQkJCXdoaWxlICggci5oYXNOZXh0KCkgKXsKLQkJCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpIHIubmV4dCgpOwotCQkJCQlpZiAoQW50UHVibGlzaGVyLlBVQkxJU0hFUl9JRC5lcXVhbHMoIHB1Ymxpc2hlci5nZXRJZCgpICkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhjYmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQ29tbW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkVudmlyb25tZW50VGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFBcmd1bWVudHNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5FeHRlbnNpb25Qb2ludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBJTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwI2NyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2csIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiWzVdOwotCQl0YWJzWzBdID0gbmV3IFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIoZ2V0VHlwZUlkcygpKTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1syXSA9IG5ldyBTb3VyY2VMb29rdXBUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgRW52aXJvbm1lbnRUYWIoKTsKLQkJdGFic1szXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNF0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZUlkcygpIAotCXsKLQkgICByZXR1cm4gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldFNlcnZlclR5cGVzRnJvbUxhdW5jaENvbmZpZyggIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiICk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWFlNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkNvbW1vblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5FbnZpcm9ubWVudFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhSlJFVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBJTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwI2NyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2csIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiWzddOwotCQl0YWJzWzBdID0gbmV3IFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIoZ2V0VHlwZUlkcygpKTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1syXSA9IG5ldyBKYXZhQ2xhc3NwYXRoVGFiKCk7Ci0JCXRhYnNbMl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzNdID0gbmV3IFNvdXJjZUxvb2t1cFRhYigpOwotCQl0YWJzWzNdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s0XSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOwotCQl0YWJzWzRdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s1XSA9IG5ldyBKYXZhSlJFVGFiKCk7Ci0JCXRhYnNbNV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwkgCi0JCXRhYnNbNl0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkgICAgcmV0dXJuIEV4dGVuc2lvblBvaW50VXRpbC5nZXRTZXJ2ZXJUeXBlc0Zyb21MYXVuY2hDb25maWcoICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIgKTsgLy8kTk9OLU5MUy0xJAl9Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5MzY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvcltdIGZEZWNvcmF0b3JzOwotCXB1YmxpYyBHZW5lcmljU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbXSBkZWNvcmF0b3JzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlmRGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID1uZXcgR3JpZExheW91dCgzLGZhbHNlKTsgCi0JCXNldExheW91dChsYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sKCl7Ci0JCWZvciAoaW50IGkgPSAwOyBmRGVjb3JhdG9ycyE9IG51bGwgJiYgaSA8IGZEZWNvcmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmRGVjb3JhdG9yc1tpXS5kZWNvcmF0ZSh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjM4YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yIAotewotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWNvcmF0ZShHZW5lcmljU2VydmVyQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0gICAgLyoqCi0JICogQ2FsbGVkIGlmIGFsbCB0aGUgZmllbGRzIGFyZSB2YWxpZC4gVGhpcyBnaXZlcyBzdWJjbGFzc2VzIG9wcG9ydHVuaXR5IHRvCi0JICogdmFsaWRhdGUgYW5kIHRha2UgbmVjZXNzYXJ5IGFjdGlvbnMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTU4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotCi0vKioKLSAqIEEgc2VydmVyRGVmaW5pdGlvblR5cGUgYXdhcmUgd2l6YXJkIGZvciBkZWZpbmluZyBydW50aW1lcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcwotICAgICAgICBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgewotCi0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2lzQ29tcGxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0gICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZSBydW50aW1lID0gZ2V0UnVudGltZURlbGVnYXRlKCk7Ci0gICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KCBDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSApIHsKLSAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBudWxsOwotICAgICAgICBpZiggZ2V0UnVudGltZURlbGVnYXRlKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbiggZ2V0U2VydmVyRGVmaW5pdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKTsKLSAgICAgICAgfQotICAgICAgICBJSW5zdGFsbGFibGVSdW50aW1lIGlyID0gU2VydmVyUGx1Z2luCi0gICAgICAgICAgICAgICAgLmZpbmRJbnN0YWxsYWJsZVJ1bnRpbWUoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldFJ1bnRpbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSApOwotICAgICAgICBpZiggaXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzID0gbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbM107Ci0gICAgICAgICAgICBmRGVjb3JhdG9yc1swXSA9IG5ldyBKUkVTZWxlY3REZWNvcmF0b3IoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLCBnZXRXaXphcmQoKSApOwotICAgICAgICAgICAgZkRlY29yYXRvcnNbMV0gPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yKAotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLCBnZXRXaXphcmQoKSwgZ2V0UnVudGltZURlbGVnYXRlKCkgKTsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzWzJdID0gbmV3IEluc3RhbGxhYmxlUnVudGltZURlY29yYXRvciggZ2V0V2l6YXJkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmRGVjb3JhdG9ycyA9IG5ldyBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yWzJdOwotICAgICAgICAgICAgZkRlY29yYXRvcnNbMF0gPSBuZXcgSlJFU2VsZWN0RGVjb3JhdG9yKCBnZXRSdW50aW1lRGVsZWdhdGUoKSwgZ2V0V2l6YXJkKCkgKTsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzWzFdID0gbmV3IFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvcigKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgcHJvcGVydGllcywgZ2V0V2l6YXJkKCksIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZSggcGFyZW50LCBmRGVjb3JhdG9ycyApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnREZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwgKQotICAgICAgICAgICAgY3VycmVudERlZmluaXRpb24gPSBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYoIGN1cnJlbnREZWZpbml0aW9uICE9IG51bGwgJiYgY3VycmVudERlZmluaXRpb24ubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2VudGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwgKQotICAgICAgICAgICAgZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2V0TmFtZSggY3JlYXRlTmFtZSgpICk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpICkvL2ZhaWxlZCBkbyBub3QgY29udGludWUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0byBzYXZlIGxhdGVzdCB2YWx1ZXMKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpICkvL2ZhaWxlZCBkbyBub3QgY29udGludWUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVOYW1lKCkgewotICAgICAgICBSdW50aW1lRGVsZWdhdGUgZGwgPSBnZXRSdW50aW1lRGVsZWdhdGUoKTsKLSAgICAgICAgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gZGwuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gTkxTLmJpbmQoCi0gICAgICAgICAgICAgICAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMucnVudGltZU5hbWUsIHJ1bnRpbWVUeXBlLmdldE5hbWUoKSApOwotICAgICAgICBJUnVudGltZVtdIGxpc3QgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0gICAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgICBTdHJpbmcgc3VmZml4TmFtZSA9IG5hbWU7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAobGlzdFtpXS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkgfHwgbGlzdFtpXS5nZXROYW1lKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBzdWZmaXhOYW1lICkpCi0gICAgICAgICAgICAgICAgICAgICYmICFsaXN0W2ldLmVxdWFscyggZGwuZ2V0UnVudGltZSgpICkgKQotICAgICAgICAgICAgICAgIHN1ZmZpeCsrOwotICAgICAgICAgICAgc3VmZml4TmFtZSA9IG5hbWUgKyAnICcgKyBzdWZmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggc3VmZml4ID4gMSApCi0gICAgICAgICAgICByZXR1cm4gc3VmZml4TmFtZTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBnZXRSdW50aW1lRGVsZWdhdGUoKSB7Ci0gICAgICAgIElSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkKLSAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0KCBUYXNrTW9kZWwuVEFTS19SVU5USU1FICk7Ci0gICAgICAgIGlmKCB3YyA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKSB3Yy5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHJOYW1lID0gZ2V0UnVudGltZU5hbWUoKTsKLSAgICAgICAgaWYoIHJOYW1lID09IG51bGwgfHwgck5hbWUubGVuZ3RoKCkgPCAxICkKLSAgICAgICAgICAgIHJOYW1lID0gIkdlbmVyaWMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5ydW50aW1lV2l6YXJkRGVzY3JpcHRpb24sIHJOYW1lICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3RpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRpdGxlKCkgewotICAgICAgICBTdHJpbmcgck5hbWUgPSBnZXRSdW50aW1lTmFtZSgpOwotICAgICAgICBpZiggck5hbWUgPT0gbnVsbCB8fCByTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgck5hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnJ1bnRpbWVXaXphcmRUaXRsZSwgck5hbWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lTmFtZSgpIHsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkgIT0gbnVsbCApCi0gICAgICAgICAgICByZXR1cm4gZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWQ3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBnZXQgbWVzc2FnZXMKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkRGlhbG9nRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGREaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQdWJsaXNoZXJTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHVibGlzaGVyU2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uQnJvd3NlRm9yQnVpbGRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZlckVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJFZGl0b3JTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyUnVubmluZ0Nhbk5vdFNhdmU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lV2l6YXJkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyV2l6YXJkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkX2pyZV9saW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpyZV9zZWxlY3RfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsU2VydmVyQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhdGlvbkRpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eVBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JOb0FudEJ1aWxkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEJ1aWxkRmlsZTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVPcGVyYXRpb25EZXNjcmlwdGlvbjsJCi0Jc3RhdGljewotCQkgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoUkVTT1VSQ0VfQlVORExFLCBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjJkYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQW50QnVpbGREaWFsb2dUaXRsZT1TZWxlY3QgRmlsZQotQW50UHVibGlzaGVyU2VjdGlvbkRlc2NyaXB0aW9uPU1vZGlmeSB0aGUgcHJvcGVydGllcyBmb3IgdGhlIEFOVCBiYXNlZCBtb2R1bGUgcHVibGlzaGVyCi1BbnRQdWJsaXNoZXJTZWN0aW9uSGVhZGluZz1BbnQgUHVibGlzaGVyIFByb3BlcnRpZXMKLUJ1dHRvbkJyb3dzZUZvckJ1aWxkRmlsZT1Ccm93c2UuLi4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQW50QnVpbGREaWFsb2dEZXNjcmlwdGlvbj1TZWxlY3QgdGhlIGJ1aWxkIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHB1Ymxpc2hpbmcKLXNlcnZlcldpemFyZFRpdGxlPU5ldyB7MH0gU2VydmVyCi1zZXJ2ZXJXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgezB9IHNlcnZlciAKLXNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlPVRoZSBzZXJ2ZXIgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSBhIGNoYW5nZSB0byB0aGUgc2V0dGluZ3MgY2FuIGJlIHNhdmVkLgotcnVudGltZVdpemFyZFRpdGxlPU5ldyB7MH0gUnVudGltZQotcnVudGltZVdpemFyZERlc2NyaXB0aW9uPURlZmluZSBhIG5ldyB7MH0gcnVudGltZQotc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZT1Ccm93c2UuLi4KLXNlcnZlck5hbWUgPSB7MH0KLXJ1bnRpbWVOYW1lPSB7MH0KLWluc3RhbGxlZF9qcmVfbGluayA9IFlvdSBjYW4gdXNlIDxhPkluc3RhbGxlZCBKUkUgcHJlZmVyZW5jZXM8L2E+IHRvIGNyZWF0ZSBhIG5ldyBKUkUKLWluc3RhbGxTZXJ2ZXJCdXR0b249SW5zdGFsbCBTZXJ2ZXIKLWluc3RhbGxhdGlvbkRpcmVjdG9yeT1TZWxlY3QgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotanJlX3NlbGVjdF9sYWJlbD0gJkpSRToKLWRlZmF1bHRKUkUgPSBEZWZhdWx0IEpSRQotaW52YWxpZFBhdGggPSB7MH0gaXMgbm90IHZhbGlkCi1lbXB0eVBhdGg9U3BlY2lmeSBhIHZhbGlkIHBhdGgKLUVycm9yTm9BbnRCdWlsZEZpbGU9QW50IGJ1aWxkIGZpbGUgZG9lcyBub3QgZXhpc3QuCi1MYWJlbEJ1aWxkRmlsZT1CdWlsZCBmaWxlOgotU2VydmVyRWRpdG9yU2VjdGlvblRpdGxlPVNlcnZlciBQcm9wZXJ0aWVzCi1TZXJ2ZXJFZGl0b3JTZWN0aW9uRGVzY3JpcHRpb249TW9kaWZ5IHNldHRpbmdzIGZvciB0aGUgc2VydmVyLgotVXBkYXRlT3BlcmF0aW9uRGVzY3JpcHRpb249VXBkYXRlIGdlbmVyaWMgc2VydmVyIHByb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3ZmMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudCBleHRlbmRzCi0gICAgICAgIFNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCi0gICAgICAgIFNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKCBnZXRTZXJ2ZXIoKSApOwotICAgICAgICBpZiggc2VydmVyUnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0U2VydmVyKCk7Ci0gICAgICAgIEdlbmVyaWNTZXJ2ZXIgZGwgPSAoR2VuZXJpY1NlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXIuY2xhc3MsIG51bGwgKTsKLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGRsLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KCBDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSApIHsKLSAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOwotICAgICAgICBHZW5lcmljU2VydmVyIGRsID0gKEdlbmVyaWNTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyLmNsYXNzLCBudWxsICk7Ci0gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKCBzZXJ2ZXIgKTsKLSAgICAgICAgZkRlY29yYXRvcnMgPSBuZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvclsxXTsKLSAgICAgICAgZkRlY29yYXRvcnNbMF0gPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25TZXJ2ZXJEZWNvcmF0b3IoIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCwgZ2V0V2l6YXJkKCksIGRsICk7Ci0gICAgICAgIG5ldyBHZW5lcmljU2VydmVyQ29tcG9zaXRlKCBwYXJlbnQsIGZEZWNvcmF0b3JzICk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvciggSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciApIHsKLSAgICAgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSkgc2VydmVyCi0gICAgICAgICAgICAgICAgLmdldFJ1bnRpbWUoKS5nZXRBZGFwdGVyKCBHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyApOwotICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgSVJ1bnRpbWUgd2MgPSAoSVJ1bnRpbWUpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgVGFza01vZGVsLlRBU0tfUlVOVElNRSApOwotICAgICAgICAgICAgcnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSkgd2MKLSAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzICk7Ci0gICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICBydW50aW1lID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKSB3Yy5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNlcnZlclR5ZXBJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSBydW50aW1lLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGlmKCBydW50aW1lVHlwZUlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNYXAgcnVudGltZVByb3BlcnRpZXMgPSBydW50aW1lLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpOwotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbiggc2VydmVyVHllcElkLAotICAgICAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWQsIHJ1bnRpbWVQcm9wZXJ0aWVzICk7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0gICAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3QoIFRhc2tNb2RlbC5UQVNLX1NFUlZFUiApOwotICAgICAgICByZXR1cm4gc2VydmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05hbWVJblVzZSggU3RyaW5nIG5hbWUgKSB7Ci0gICAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhc2VydmVyc1tpXS5lcXVhbHMoIGdldFNlcnZlcigpLmdldE9yaWdpbmFsKCkgKQotICAgICAgICAgICAgICAgICAgICAmJiAoc2VydmVyc1tpXS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJOYW1lLCBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZlcigpICkuZ2V0TmFtZSgpICk7Ci0gICAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgICBTdHJpbmcgc3VmZml4TmFtZSA9IG5hbWU7Ci0gICAgICAgIHdoaWxlKCBpc05hbWVJblVzZSggc3VmZml4TmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VmZml4TmFtZSA9IG5hbWUgKyAnICcgKyBzdWZmaXg7Ci0gICAgICAgICAgICBzdWZmaXgrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VmZml4TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgaWYoZkRlY29yYXRvcnMgPT0gbnVsbCApewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZkRlY29yYXRvcnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZkRlY29yYXRvcnNbaV0udmFsaWRhdGUoKSApLy9mYWlsZWQgZG8gbm90IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgaWYoZkRlY29yYXRvcnMgPT0gbnVsbCApewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIHZhbGlkYXRlIG5lZWRlZCB0byBzYXZlIHRoZSBsYXRlc3QgdmFsdWVzLgotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZEZWNvcmF0b3JzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGZEZWNvcmF0b3JzW2ldLnZhbGlkYXRlKCkgKS8vZmFpbGVkIGRvIG5vdCBjb250aW51ZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwotICAgICAgICBpZiggc05hbWUgPT0gbnVsbCB8fCBzTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgc05hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlcldpemFyZERlc2NyaXB0aW9uLCBzTmFtZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7Ci0gICAgICAgIGlmKCBnZXRTZXJ2ZXIoKSAhPSBudWxsICYmIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSAhPSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0aXRsZSgpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwotICAgICAgICBpZiggc05hbWUgPT0gbnVsbCB8fCBzTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgc05hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlcldpemFyZFRpdGxlLCBzTmFtZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1VpUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZjMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1VpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JLyoqCi0JICogUGx1Zy1pbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQkFOX0lNQUdFID0gImdlbmVyaWNsb2dvIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBHZW5lcmljVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBHZW5lcmljVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLkdlbmVyaWNVaVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdlbmVyaWNVaVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0gICAgcHJvdGVjdGVkIEltYWdlUmVnaXN0cnkgY3JlYXRlSW1hZ2VSZWdpc3RyeSgpIHsKLSAgICAgICAgSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZWdpc3RyeS5wdXQoV0laQkFOX0lNQUdFLCBkZXNjKTsKLSAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5OwotICAgIH0KLSAgCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpewotCQlyZXR1cm4gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjVhMzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZURlY29yYXRvciBpbXBsZW1lbnRzCi0JCUdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgZldpemFyZDsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWVEZWNvcmF0b3IoSVdpemFyZEhhbmRsZSB3aXphcmQsIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJZlJ1bnRpbWUgPSBydW50aW1lOwotCQlmV2l6YXJkID0gd2l6YXJkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlY29yYXRlKGZpbmFsIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWZpbmFsIElJbnN0YWxsYWJsZVJ1bnRpbWUgaXIgPSBTZXJ2ZXJQbHVnaW4KLQkJCQkuZmluZEluc3RhbGxhYmxlUnVudGltZShmUnVudGltZS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKQotCQkJCQkJLmdldElkKCkpOwotCi0JCUJ1dHRvbiBpbnN0YWxsID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnN0YWxsU2VydmVyQnV0dG9uKTsKLQkJaW5zdGFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuaW5zdGFsbGF0aW9uRGlyZWN0b3J5KTsKLQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQotCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSwKLQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLAotCQkJCQkJCQkJCSJFcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlmV2l6YXJkLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOwotCQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwKLQkJCQkJCQkJIkVycm9yIGluc3RhbGxpbmcgcnVudGltZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0pSRVNlbGVjdERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc1NTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIEpSRVNlbGVjdERlY29yYXRvciBpbXBsZW1lbnRzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCXByaXZhdGUgTGlzdCBpbnN0YWxsZWRKUkVzOwotCXByaXZhdGUgU3RyaW5nW10ganJlTmFtZXM7Ci0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgZldpemFyZDsgCi0JcHVibGljIEpSRVNlbGVjdERlY29yYXRvcihHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lLCBJV2l6YXJkSGFuZGxlIHdpemFyZEhhbmRsZSl7Ci0JCXN1cGVyKCk7Ci0JCWZSdW50aW1lID0gcnVudGltZTsKLQkJZldpemFyZCA9IHdpemFyZEhhbmRsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoZmluYWwgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJdXBkYXRlSlJFcygpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsU1dULk5PTkUpOwotCQlsaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UsMywxKSk7Ci0JCWxpbmsuc2V0VGV4dChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnN0YWxsZWRfanJlX2xpbmspOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuanJlX3NlbGVjdF9sYWJlbCk7Ci0JCQotCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLGZhbHNlLGZhbHNlLDIsMSk7Ci0JCQotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzZWwgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gbnVsbDsKLQkJCQlpZiAoc2VsID4gMCkKLQkJCQkJdm1JbnN0YWxsID0gKElWTUluc3RhbGwpIGluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOwotCQkJCi0JCQkJZlJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZShjb21wb3NpdGUpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGZSdW50aW1lIT1udWxsKXsKLQkJCWlmKGZSdW50aW1lLmlzVXNpbmdEZWZhdWx0SlJFKCkpewotCQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJCX1lbHNlewotCQkJCWNvbWJvLnNldFRleHQoZlJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZShHZW5lcmljU2VydmVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJCQlyZXN1bHRbMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJaW5zdGFsbGVkSlJFcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZNSW5zdGFsbFR5cGVbXSB2bUluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0JCWludCBzaXplID0gdm1JbnN0YWxsVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlc1tpXS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZTIgPSB2bUluc3RhbGxzLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCWluc3RhbGxlZEpSRXMuYWRkKHZtSW5zdGFsbHNbal0pOwotCQkJfQotCQl9Ci0JCQotCQlzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmRlZmF1bHRKUkU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IChJVk1JbnN0YWxsKSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCWpyZU5hbWVzW2krMV0gPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCQotCQotCQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCSAgICBJU3RhdHVzIHN0YXR1cyA9IGZSdW50aW1lLnZhbGlkYXRlKCk7Ci0JICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LICkKLQkgICAgewotCSAgICAgICAgZldpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCSAgICAgICAgZldpemFyZC51cGRhdGUoKTsKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgICAgZldpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZXaXphcmQudXBkYXRlKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGIzZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogU1dUIFV0aWxpdGllcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCXByaXZhdGUgc3RhdGljIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEaWFsb2dVbml0cyhDb250cm9sIHRlc3RDb250cm9sKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB3aWR0aCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEJ1dHRvbldpZHRoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWludCB3aWR0aEhpbnQgPSBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotCQkJCXRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcAotCSAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gYSBidXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQliLnNldFRleHQobGFiZWwpOwotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCi0JICogCi0JICogQHBhcmFtIGNvbXAKLQkgKiAgICAgICAgICAgIGEgY29tcG9uZW50Ci0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeCkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcAotCSAqICAgICAgICAgICAgYSBjb21wb25lbnQKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgcGl4ZWxzCi0JICogQHJldHVybiBkbHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeSkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIHkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCwgdGV4dCBhbmQgYSBidXR0b24gdG8gb3BlbiBhIGRpcmVjdG9yeSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHZhbHVlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRQYXRoKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRQYXRoKHRpdGxlLCB2YWx1ZSwgcGFyZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwsIHRleHQgYW5kIGEgYnV0dG9uIHRvIG9wZW4gYSBkaXJlY3RvdHkgZGlhbG9nLiBUaGlzCi0JICogbWV0aG9kIGNyZWF0ZXMgRm9ydW0gVUkgY29tcGF0aWJsZSB3aWRnZXRzLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRQYXRoKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbnVsbDsKLQkJVGV4dCBjVGV4dCA9IG51bGw7Ci0JCUJ1dHRvbiBidXR0b24gPSBudWxsOwotCi0JCWlmICh0b29sa2l0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCQljVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNIQURPV19JTiB8IFNXVC5CT1JERVIpOwotCQkJYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZvcm1MYWJlbCh0aXRsZSwgcGFyZW50LCB0b29sa2l0KTsKLQkJCWNUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUpOwotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlLAotCQkJCQlTV1QuUFVTSCk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0KLQkJZmluYWwgVGV4dCB0ZXh0ID0gY1RleHQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRsZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCWRsZy5zZXRGaWx0ZXJQYXRoKHRleHQuZ2V0VGV4dCgpLnJlcGxhY2UoJ1xcJywgJy8nKSk7Ci0JCQkJU3RyaW5nIHJlcyA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXRleHQuc2V0VGV4dChyZXMucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLCB0ZXh0IGFuZCBhIGJ1dHRvbiB0aGF0cyBvcGVucyBhIGZpbGUgZGlhbG9nCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkRmlsZShTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRmlsZSh0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLCB0ZXh0IGFuZCBhIGJ1dHRvbiB0aGF0cyBvcGVucyBhIGZpbGUgZGlhbG9nLiBUaGlzIG1ldGhvZAotCSAqIGlzIHVzZWQgZm9yIGNyZWF0aW5nIEZvcm0gVUkgY29tcGF0aWJsZSB3aWRnZXRzCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkRmlsZShTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JCUxhYmVsIGxhYmVsOwotCQlUZXh0IGNUZXh0OwotCQlCdXR0b24gYnV0dG9uOwotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQkJY1RleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSEFET1dfSU4gfCBTV1QuQk9SREVSKTsKLQkJCWJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZSk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQljVGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChwYXJlbnQsIHZhbHVlKTsKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZSwKLQkJCQkJU1dULlBVU0gpOwotCQl9Ci0JCWZpbmFsIFRleHQgdGV4dCA9IGNUZXh0OwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGV4dC5zZXRUZXh0KHZhbHVlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRsZyA9IG5ldyBGaWxlRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQlkbGcuc2V0RmlsZU5hbWUodGV4dC5nZXRUZXh0KCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCQlTdHJpbmcgcmVzID0gZGxnLm9wZW4oKTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJdGV4dC5zZXRUZXh0KHJlcy5yZXBsYWNlKCdcXCcsICcvJykpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgYW5kIGEgdGV4dAotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIFRleHQgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRUZXh0KFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRUZXh0KCB0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYSB0ZXh0LiBUaGlzIG1ldGhvZCBjcmVhdGVkIGZvcm0gdWkgY29tcGF0aWJsZQotCSAqIHdpZGdldHMKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuIFRleHQgY29udHJvbCB0aGF0IGhvbGRzIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkVGV4dChTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JCUxhYmVsIGxhYmVsOwotCQlUZXh0IHRleHQ7Ci0JCWlmICh0b29sa2l0ID09IG51bGwpIHsKLQkJCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0hBRE9XX0lOIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQl0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUpOwotCQl9Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENIRUNLIHN0eWxlIGJ1dHRvbiBhbmQgbGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiBDaGVjayBCdXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVMYWJlbGVkQ2hlY2soU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRDaGVjayh0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENIRUNLIHN0eWxlIGJ1dHRvbiBhbmQgbGFiZWwuIFRoaXMgbWV0aG9kIGlzIGZvcm0gdWkgY29tcGF0aWJsZQotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVMYWJlbGVkQ2hlY2soU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUxhYmVsIGxhYmVsOwotCQlCdXR0b24gYnV0dG9uOwotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIG51bGwsIFNXVC5DSEVDSyk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgYW5kIGFuIGVkaXRhYmxlIENvbWJvLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlTGFiZWxlZENvbWJvKFN0cmluZyB0aXRsZSwgU3RyaW5nW10gdmFsdWVzLENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWxlZENvbWJvKHRpdGxlLCB2YWx1ZXMsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIGFuZCBhbiBlZGl0YWJsZSBDb21ibwotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuIENvbWJvCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVMYWJlbGVkQ29tYm8oU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSB2YWx1ZXMsIENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQotCQlMYWJlbCBsYWJlbDsKLQotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRm9ybUxhYmVsKHRpdGxlLCBwYXJlbnQsIHRvb2xraXQpOwotCQl9Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWlmICh0b29sa2l0ICE9IG51bGwpIHsKLQkJCXRvb2xraXQuYWRhcHQoY29tYm8sIHRydWUsIHRydWUpOwotCQl9Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJY29tYm8uc2VsZWN0KDApOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYW4gZWRpdGFibGUgQ29tYm8uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlcwotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIENvbWJvCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyhTdHJpbmcgdGl0bGUsIFN0cmluZ1tdIHZhbHVlcyxTdHJpbmcgdmFsdWUsQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyh0aXRsZSwgdmFsdWVzLHZhbHVlLCBwYXJlbnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYW4gZWRpdGFibGUgQ29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlTGFiZWxlZEVkaXRhYmxlQ29tYm8oU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSB2YWx1ZXMsU3RyaW5nIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQkJTGFiZWwgbGFiZWw7Ci0KLQkJaWYgKHRvb2xraXQgPT0gbnVsbCkgewotCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZvcm1MYWJlbCh0aXRsZSwgcGFyZW50LCB0b29sa2l0KTsKLQkJfQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSEFET1dfSU4gfCBTV1QuQk9SREVSKTsKLQkJaWYgKHRvb2xraXQgIT0gbnVsbCkgewotCQkJdG9vbGtpdC5hZGFwdChjb21ibywgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbWJvLmFkZCh2YWx1ZXNbaV0pOwotCQl9Ci0JCWlmIChjb21iby5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQljb21iby5zZWxlY3QoMCk7Ci0JCWNvbWJvLnNldFRleHQodmFsdWUpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGFiZWwgY3JlYXRlRm9ybUxhYmVsKFN0cmluZyB0aXRsZSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlMYWJlbCBsYWJlbDsKLQkJbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhcmVudCwgdGl0bGUpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMjg4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLQotLyoqCi0gKiBBIHdpemFyZCBmcmFnbWVudCB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHNlcnZlcmRlZiBmaWxlcy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCi0gICAgcHJpdmF0ZSBJV2l6YXJkSGFuZGxlIGZXaXphcmQ7Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCSAgICAKLQkgICAgdGhpcy5mV2l6YXJkID0gaGFuZGxlOwotCSAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkID0gbmV3IEdyaWRMYXlvdXQoMSxmYWxzZSk7Ci0JCWdyaWQubWFyZ2luV2lkdGg9MDsKLQkJY29udGFpbmVyLnNldExheW91dChncmlkKTsKLQkgICAgY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQloYW5kbGUuc2V0SW1hZ2VEZXNjcmlwdG9yKEdlbmVyaWNVaVBsdWdpbi5nZXREZWZhdWx0KCkuaW1hZ2VEZXNjcmlwdG9yKEdlbmVyaWNVaVBsdWdpbi5XSVpCQU5fSU1BR0UpKTsKLQkJaGFuZGxlLnNldFRpdGxlKHRpdGxlKCkpOwotCQloYW5kbGUuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24oKSk7Ci0JCWNyZWF0ZUNvbnRlbnQoY29udGFpbmVyLGhhbmRsZSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXB1YmxpYyBJV2l6YXJkSGFuZGxlIGdldFdpemFyZCgpewotCSAgICByZXR1cm4gZldpemFyZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIG9uIHRoZSB3aXphcmQgaGVhZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBkZXNjcmlwdGlvbigpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSB3aXphcmQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdGl0bGUoKTsKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlYWwgY29udGVudAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaGFuZGxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSk7Ci0KLQkvKioKLQkgKiBSZXR1bnMgdGhlIFNlcnZlclJ1bnRpbWUuCi0JICogQHBhcmFtIGRlZmluaXRpb25JRAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogQHJldHVybgotCSAqLwkKLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbklELCBNYXAgcHJvcGVydGllcykKLQl7Ci0JICAgIHJldHVybiBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihkZWZpbml0aW9uSUQscHJvcGVydGllcyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dW5zIHRoZSBTZXJ2ZXJSdW50aW1lLgotICAgICAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQKLSAgICAgKiBAcGFyYW0gcnVudGltZVR5cGVJZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybgotICAgICAqLyAKLSAgICBwcm90ZWN0ZWQgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihTdHJpbmcgc2VydmVyVHlwZUlkLCBTdHJpbmcgcnVudGltZVR5cGVJZCwgTWFwIHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkuZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oc2VydmVyVHlwZUlkLCBydW50aW1lVHlwZUlkLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJjZGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogUHJvdmlkZXMgdGhlIFVJIG9iamVjdHMgZm9yIGdhdGhlcmluZyB1c2VyIGluZm9ybWF0aW9uCi0gKiBmb3Igc2VydmVyIHByb3BlcnRpZXMuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvciBpbXBsZW1lbnRzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9SVU5USU1FID0gUHJvcGVydHkuQ09OVEVYVF9SVU5USU1FOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfU0VSVkVSID0gUHJvcGVydHkuQ09OVEVYVF9TRVJWRVI7Ci0JcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIGZEZWZpbml0aW9uOwotICAgIHByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0OwotCXByb3RlY3RlZCBTdHJpbmcgZkxhc3RNZXNzYWdlOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIGZXaXphcmQ7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9wZXJ0eUNvbnRyb2xzPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFBhdGhNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlTdHJpbmcgcGF0aCA9ICgoVGV4dCkgZS53aWRnZXQpLmdldFRleHQoKTsKLQkJCQotCQkJaWYocGF0aC5sZW5ndGgoKTwxKQotCQkJewotCQkJCWZMYXN0TWVzc2FnZSA9IEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmVtcHR5UGF0aDsKLQkJCQlmV2l6YXJkLnNldE1lc3NhZ2UoZkxhc3RNZXNzYWdlLElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfQotCQkJZWxzZSBpZighcGF0aEV4aXN0KHBhdGgpKXsKLQkJCQlmTGFzdE1lc3NhZ2UgPSBOTFMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnZhbGlkUGF0aCxwYXRoKTsKLQkJCQlmV2l6YXJkLnNldE1lc3NhZ2UoZkxhc3RNZXNzYWdlLElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfWVsc2V7Ci0JCQkJaWYoZkxhc3RNZXNzYWdlIT1udWxsICYmIGZMYXN0TWVzc2FnZS5lcXVhbHMoZldpemFyZC5nZXRNZXNzYWdlKCkpKXsKLQkJCQkJZkxhc3RNZXNzYWdlPW51bGw7Ci0JCQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIHBhdGhFeGlzdChTdHJpbmcgcGF0aCl7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmV4aXN0cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVmaW5pdGlvbgotCSAqIEBwYXJhbSBpbml0aWFsUHJvcGVydGllcwotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIGhhbmRsZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvcihTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24sIE1hcCBpbml0aWFsUHJvcGVydGllcywgU3RyaW5nIGNvbnRleHQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJZlByb3BlcnRpZXMgPSBpbml0aWFsUHJvcGVydGllczsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCQlmV2l6YXJkID0gaGFuZGxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yI2RlY29yYXRlKG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJTGlzdCBwcm9wZXJ0aWVzID1udWxsOyAKLQkJaWYoZkRlZmluaXRpb249PW51bGwpewotCQkJcHJvcGVydGllcz0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCQllbHNlewotCQkJcHJvcGVydGllcz0gZkRlZmluaXRpb24uZ2V0UHJvcGVydHkoKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCWlmICh0aGlzLmZDb250ZXh0LmVxdWFscyhwcm9wZXJ0eS5nZXRDb250ZXh0KCkpKQotCQkJCWNyZWF0ZVByb3BlcnR5Q29udHJvbChjb21wb3NpdGUsIHByb3BlcnR5KTsKLQkJfQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JfQotCi0JCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSl7Ci0gICAgCWlmKCBQcm9wZXJ0eS5UWVBFX0RJUkVDVE9SWS5lcXVhbHMocHJvcGVydHkuZ2V0VHlwZSgpKSkgewotICAgIAkJVGV4dCBwYXRoID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkUGF0aChwcm9wZXJ0eS5nZXRMYWJlbCgpLGdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpLHBhcmVudCk7Ci0gICAgCQlwYXRoLnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcGF0aC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgUGF0aE1vZGlmeUxpc3RlbmVyKCkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKHBhdGgpOwotICAgICAJfSBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0ZJTEUuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIFRleHQgZmlsZSA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZEZpbGUocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQpOwotICAgIAkJZmlsZS5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCWZpbGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFBhdGhNb2RpZnlMaXN0ZW5lcigpKTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChmaWxlKTsKLSAgICAgICAJfSBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIEJ1dHRvbiBib29sID1TV1RVdGlsLmNyZWF0ZUxhYmVsZWRDaGVjayhwcm9wZXJ0eS5nZXRMYWJlbCgpLCgidHJ1ZSIuZXF1YWxzKCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSkpLAlwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0gICAgCQlib29sLnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKGJvb2wpOwotICAgICAgIAl9ZWxzZSBpZihQcm9wZXJ0eS5UWVBFX1NFTEVDVC5lcXVhbHMocHJvcGVydHkuZ2V0VHlwZSgpKSkgewotICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHkuZ2V0RGVmYXVsdCgpLCIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCWludCB0b2tlbkNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0gICAgCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW3Rva2VuQ291bnRdOwotICAgIAkJaW50IGkgPTA7Ci0gICAgCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpICYmIGk8dG9rZW5Db3VudCl7Ci0gICAgCQkJdmFsdWVzW2ldPXRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAJCQlpKys7Ci0gICAgCQl9Ci0gICAgICAgCQlDb21ibyBjb21ibyA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZENvbWJvKHByb3BlcnR5LmdldExhYmVsKCksdmFsdWVzLCBwYXJlbnQpOwotICAgICAgIAkJY29tYm8uc2V0RGF0YShwcm9wZXJ0eSk7Ci0gICAgICAgCQlyZWdpc3RlckNvbnRyb2woY29tYm8pOwotICAgICAgIAl9ZWxzZSBpZihQcm9wZXJ0eS5UWVBFX1NFTEVDVF9FRElULmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eS5nZXREZWZhdWx0KCksIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdG9rZW5Db3VudF07Ci0gICAgCQlpbnQgaSA9MDsKLSAgICAJCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgaTx0b2tlbkNvdW50KXsKLSAgICAJCQl2YWx1ZXNbaV09dG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgIAkJCWkrKzsKLSAgICAJCX0KLSAgICAgICAJCUNvbWJvIGNvbWJvID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyhwcm9wZXJ0eS5nZXRMYWJlbCgpLHZhbHVlcyxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSwgcGFyZW50KTsKLSAgICAgICAJCWNvbWJvLnNldERhdGEocHJvcGVydHkpOwotICAgICAgIAkJcmVnaXN0ZXJDb250cm9sKGNvbWJvKTsKLSAgICAgICAJfQotICAgICAgIAllbHNlIHsvL2RlZmF1bHQgaXMgVEVYVAotICAgIAkgICAgVGV4dCBkZWZhdWx0VGV4dD0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkVGV4dChwcm9wZXJ0eS5nZXRMYWJlbCgpLGdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpLHBhcmVudCk7Ci0gICAgCQlkZWZhdWx0VGV4dC5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChkZWZhdWx0VGV4dCk7Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb250cm9sKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgCWZQcm9wZXJ0eUNvbnRyb2xzLmFkZChjb250cm9sKTsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eSBwcm9wZXJ0eSl7CQotCQlpZihmUHJvcGVydGllcyE9bnVsbCAmJiBmUHJvcGVydGllcy5pc0VtcHR5KCk9PWZhbHNlKXsKLQkJLy91c2VyIHByb3BlcnRpZXMgZXhpc3QgdXNlIHRob3NlCi0JCQlyZXR1cm4gZkRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcygoU3RyaW5nKWZQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eS5nZXRJZCgpKSk7Ci0JCX0JCi0JCWlmKFByb3BlcnR5LlRZUEVfU0VMRUNUX0VESVQuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHkuZ2V0RGVmYXVsdCgpLCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXsKLQkJCQlyZXR1cm4gZkRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZEZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMocHJvcGVydHkuZ2V0RGVmYXVsdCgpKTsJCi0JfQkKLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lL3ZhbHVlIHBhaXJzLgotICAgICogQHJldHVybiBNYXAgY29udGFpbmluZyB0aGUgdmFsdWVzIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyCi0gICAgKi8KLQlwdWJsaWMgTWFwIGdldFZhbHVlcygpewotCQlNYXAgcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIAlmb3IoaW50IGk9MDsgaTxmUHJvcGVydHlDb250cm9scy5zaXplKCk7aSsrKXsKLSAgICAJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpKChDb250cm9sKWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKSkuZ2V0RGF0YSgpOwotICAgIAkJaWYoZlByb3BlcnR5Q29udHJvbHMuZ2V0KGkpaW5zdGFuY2VvZiBCdXR0b24pewotICAgIAkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKTsKLSAgICAJCQlwcm9wZXJ0eU1hcC5wdXQocHJvcC5nZXRJZCgpLEJvb2xlYW4udG9TdHJpbmcoYnV0dG9uLmdldFNlbGVjdGlvbigpKSk7Ci0gICAgCQl9Ci0gICAgCQllbHNlIGlmKGZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKSBpbnN0YW5jZW9mIENvbWJvKXsKLSAgICAJCQlDb21ibyBjb21ibyA9IChDb21ibylmUHJvcGVydHlDb250cm9scy5nZXQoaSk7Ci0gICAgIAkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgIAkJCWlmICggaW5kZXggPiAwICl7Ly9pcyB0aGVyZSBhIHNlbGVjdGlvbj8KLSAgICAgCQkJICAgIHByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksY29tYm8uZ2V0SXRlbShpbmRleCkpOwotICAgICAJCQl9Ci0gICAgIAkJCWVsc2V7Ci0gICAgIAkJCSAgIHByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksY29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgCQkJfQotICAgICAJCQkKLSAgICAJCX1lbHNlewotICAgIAkJCVRleHQgdGV4dCA9IChUZXh0KWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKTsKLSAgICAJCQlwcm9wZXJ0eU1hcC5wdXQocHJvcC5nZXRJZCgpLHRleHQuZ2V0VGV4dCgpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gcHJvcGVydHlNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmM5MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotcHVibGljIGNsYXNzIFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvciBleHRlbmRzIFNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yIHsKLQotCXByaXZhdGUgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZlJ1bnRpbWU7Ci0JcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvcihTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24sIE1hcCBpbml0aWFsUHJvcGVydGllcywgSVdpemFyZEhhbmRsZSB3aXphcmQsIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbiwgaW5pdGlhbFByb3BlcnRpZXMsQ09OVEVYVF9SVU5USU1FLHdpemFyZCk7Ci0JCWZSdW50aW1lPXJ1bnRpbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKXsKLQotCQlpZihmUnVudGltZT09bnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZlJ1bnRpbWUuc2V0U2VydmVyRGVmaW5pdGlvbklkKGZSdW50aW1lLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotICAgICAgICBmUnVudGltZS5zZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoZ2V0VmFsdWVzKCkpOwotICAgICAgIAotCQlJU3RhdHVzIHN0YXR1cyA9IGZSdW50aW1lLnZhbGlkYXRlKCk7Ci0JCQotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSl7Ci0KLQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJZldpemFyZC51cGRhdGUoKTsKLQkgICAgICAgIFN0cmluZyB3RGlyID0gZlJ1bnRpbWUuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGZSdW50aW1lLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpOyAKLQkgICAgICAgIGZSdW50aW1lLmdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKHdEaXIpKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlmV2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCWZXaXphcmQudXBkYXRlKCk7Ci0JCXJldHVybiB0cnVlOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYThjYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIFNlcnZlciBwcm9wZXJ0aWVzIGRlY29yYXRvci4KLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvciBleHRlbmRzCi0JCVNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yIHsKLQkKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXIgZlNlcnZlcjsKLQlwdWJsaWMgU2VydmVyVHlwZURlZmluaXRpb25TZXJ2ZXJEZWNvcmF0b3IoU2VydmVyUnVudGltZSBkZWZpbml0aW9uLCBNYXAgaW5pdGlhbFByb3BlcnRpZXMsSVdpemFyZEhhbmRsZSB3aXphcmQsR2VuZXJpY1NlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbiwgaW5pdGlhbFByb3BlcnRpZXMsQ09OVEVYVF9TRVJWRVIsIHdpemFyZCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICAgIGlmKGZTZXJ2ZXIhPW51bGwpCi0gICAgICAgIHsKLQkJCWZTZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKGdldFZhbHVlcygpKTsKLQkJCXN0YXR1cyA9IGZTZXJ2ZXIudmFsaWRhdGUoKTsKLSAgICAgICAgfQotCQlpZihzdGF0dXM9PW51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJewotCQkJZldpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQlmV2l6YXJkLnVwZGF0ZSgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZldpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJZldpemFyZC51cGRhdGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL0FudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL0FudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNGRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9BbnRCdWlsZEZpbGVTZWxlY3Rpb25FZGl0b3JTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBbnRCdWlsZEZpbGVTZWxlY3Rpb25FZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbnsKLQlwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgVGV4dCBidWlsZEZpbGVUZXh0OwotCXByb3RlY3RlZCBib29sZWFuIGZVcGRhdGluZzsKLSAgIAotCXByaXZhdGUgY2xhc3MgQnVpbGRGaWxlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyewotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCQlPYmplY3QgZWxlbWVudCkgewotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGUpZWxlbWVudCk7Ci0JCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lbmRzV2l0aCgiLnhtbCIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJCWlmKCBjb250ZW50VHlwZSAhPSBudWxsKXsKLQkJCQkJCXJldHVybiAib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50QnVpbGRGaWxlIi5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICEoKElQcm9qZWN0KWVsZW1lbnQpLmlzT3BlbigpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKXsgLy8gaS5lLiBJUHJvamVjdCwgSUZvbGRlcgotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKXsKLQkJCQkJCWlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnRFbGVtZW50LCByZXNvdXJjZXNbaV0pKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlZAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCX0KLQkJCi0JfQotICAgIAotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlpZiggc2VydmVyICE9IG51bGwgKXsKLQkJCWZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0ICkgewotCQkJCWlmKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTICkpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAhZlVwZGF0aW5nICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmVXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAJCQlPYmplY3QgdmFsdWUgPSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCk7Ci0gICAgICAgICAgICAgIAkJCWJ1aWxkRmlsZVRleHQuc2V0VGV4dCh2YWx1ZSA9PSBudWxsPyAiIjogKFN0cmluZyl2YWx1ZSApOyAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZVcGRhdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCi0JCQotCX0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0JCUZvcm1Ub29sa2l0IGZvcm1Ub29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGZvcm1Ub29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJCXNlY3Rpb24uc2V0VGV4dChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5BbnRQdWJsaXNoZXJTZWN0aW9uSGVhZGluZyk7Ci0JCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLkFudFB1Ymxpc2hlclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UpKTsKLQkJCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZm9ybVRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPTM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuTk9ORSx0cnVlLGZhbHNlKSk7Ci0JCQotCQkKLQkJTGFiZWwgYnVpbGRGaWxlTGFiZWwgPSBmb3JtVG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLkxhYmVsQnVpbGRGaWxlKTsKLQkJYnVpbGRGaWxlTGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JtVG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOwotCQlidWlsZEZpbGVUZXh0ID0gZm9ybVRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgb2xkVmFsdWUgPSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCk9PW51bGwgPyIiOiAvLyROT04tTkxTLTEkCi0JCQkoU3RyaW5nKWZTZXJ2ZXIuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCkuZ2V0KEdlbmVyaWNTZXJ2ZXIuUFJPUF9DVVNUT01fQlVJTERfU0NSSVBUKSA7Ci0JCWJ1aWxkRmlsZVRleHQuc2V0VGV4dChvbGRWYWx1ZSk7Ci0JCQotCQlidWlsZEZpbGVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsJCQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKCBHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCwgYnVpbGRGaWxlVGV4dC5nZXRUZXh0KCkgKTsKLQkJCQkKLQkJCX0KLQkJCi0JCX0pOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlidWlsZEZpbGVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlCdXR0b24gYnVpbGRGaWxlQnRuID0gZm9ybVRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQnV0dG9uQnJvd3NlRm9yQnVpbGRGaWxlLCBTV1QuUFVTSCk7Ci0JCWJ1aWxkRmlsZUJ0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlwYXJlbnQuZ2V0U2hlbGwoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLQkJCQkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJCQkvLyBkaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBGaWxlVmFsaWRhdG9yKCkpOwotCQkJCWRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLQkJCQlkaWFsb2cuc2V0VGl0bGUoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQW50QnVpbGREaWFsb2dUaXRsZSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQW50QnVpbGREaWFsb2dEZXNjcmlwdGlvbik7Ci0JCQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgQnVpbGRGaWxlRmlsdGVyKCkpOwotCQkJCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQkJYnVpbGRGaWxlVGV4dC5zZXRUZXh0KFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkuZ2VuZXJhdGVWYXJpYWJsZUV4cHJlc3Npb24oIndvcmtzcGFjZV9sb2MiLGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IAotCi0JCQl9Ci0JCQotCQl9KTsKLQotCQlmb3JtVG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JICAgIHN1cGVyLmRpc3Bvc2UoKTsKLQkgICAgICAgaWYoIHNlcnZlciE9IG51bGwgKQotCSAgICAgICAgICAgIHNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCSAgCi0JfQotCQotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihidWlsZEZpbGVUZXh0LmdldFRleHQoKSk7Ci0JCQlpZiAoIGZpbGVuYW1lIT0gbnVsbCAmJiBmaWxlbmFtZS5sZW5ndGgoKT4wICApCi0JCQl7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQkJCWlmICggIWYuZXhpc3RzKCkgKXsKLQkJCQkJSVN0YXR1c1tdIHN0ID0gbmV3IFN0YXR1c1sxXTsJCi0JCQkJCXN0WzBdID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLEdlbmVyaWNVaVBsdWdpbi5QTFVHSU5fSUQsR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuRXJyb3JOb0FudEJ1aWxkRmlsZSk7Ci0JCQkJCXJldHVybiBzdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVTdGF0dXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlT3BlcmF0aW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotCXsKLQkJaWYgKCFmVXBkYXRpbmcpIHsKLQkJCWZVcGRhdGluZyA9IHRydWU7Ci0JCQlleGVjdXRlKG5ldyBVcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbihzZXJ2ZXIsCi0JCQkJCUdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlVwZGF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uLAotCQkJCQlwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpKTsKLQkJCWZVcGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotfSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJQcm9wZXJ0aWVzRWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWE1NDQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoZXNMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91cjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yU2VjdGlvbjsKLQotcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbnsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JRF9TRVJWRVJfUlVOTklORyA9ICJzZXJ2ZXJfcnVubmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQlwcml2YXRlIElMYXVuY2hlc0xpc3RlbmVyMiBmTGF1bmNoTGlzdGVuZXI7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmVXBkYXRpbmc7Ci0gICAKLSAgICAKLQlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJaWYoc2VydmVyIT1udWxsKXsKLQkJCWZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZSggUHJvcGVydHlDaGFuZ2VFdmVudCBldnQgKSB7Ci0JCQkJaWYoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyggR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMgKSkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoICFmVXBkYXRpbmcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZVcGRhdGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250cm9scygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZlVwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCQlmTGF1bmNoTGlzdGVuZXIgPSBuZXcgSUxhdW5jaGVzTGlzdGVuZXIyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzUmVtb3ZlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvL05vdGhpbmcgdG8gZG8KLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTZXJ2ZXJMYXVuY2hDb25maWcoSUxhdW5jaFtdIGxhdW5jaGVzKXsKLQkJCQlmb3IgKGludCBpPTA7IGk8IGxhdW5jaGVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gbGF1bmNoZXNbaV0uZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJCQkJaWYgKGxhdW5jaENvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNlcnZlcklkOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXNlcnZlcklkID0gbGF1bmNoQ29uZmlnLmdldEF0dHJpYnV0ZSggR2VuZXJpY1NlcnZlckJlaGF2aW91ci5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JCQkJCQkJCWlmIChmU2VydmVyLmdldFNlcnZlcigpLmdldElkKCkuZXF1YWxzKHNlcnZlcklkKSkgewotCQkJCQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZzsKLQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vSWdub3JlCi0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsYXVuY2hlc0NoYW5nZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJLy9Ob3RoaW5nIHRvIGRvCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNBZGRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYyA9IGdldFNlcnZlckxhdW5jaENvbmZpZyhsYXVuY2hlcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoIGxjICAhPSBudWxsKXsKLQkJCQkJCWlmICgidHJ1ZSIuZXF1YWxzKGxjLmdldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyQmVoYXZpb3VyLkFUVFJfU1RPUCwgImZhbHNlIikpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCi0JCQkJCQlzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsJCQkJCQkKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtID0gZ2V0TWFuYWdlZEZvcm0oKTsKLQkJCQkJCQkJCW1hbmFnZWRGb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZShNRVNTQUdFX0lEX1NFUlZFUl9SVU5OSU5HKTsKLQkJCQkJCQkJCW1hbmFnZWRGb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkudXBkYXRlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2V7Ci0JCQkJCQkJc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7CQkJCQkJCi0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlKE1FU1NBR0VfSURfU0VSVkVSX1JVTk5JTkcsR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyUnVubmluZ0Nhbk5vdFNhdmUgLCBudWxsLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJfSk7Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNUZXJtaW5hdGVkKElMYXVuY2hbXSBsYXVuY2hlcykgewotCQkJCWlmKGdldFNlcnZlckxhdW5jaENvbmZpZyhsYXVuY2hlcykgIT0gbnVsbCApCi0JCQkJewotCQkJCQlzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlKE1FU1NBR0VfSURfU0VSVkVSX1JVTk5JTkcpOwotCQkJCQkJfQkJCQotCQkJCQl9KTsKLQkJCQl9CQkJCQkKLQkJCQkJCi0JCQl9Ci0JCQotCQl9OwotCQkKLQkJZ2V0TGF1bmNoTWFuYWdlcigpLmFkZExhdW5jaExpc3RlbmVyKGZMYXVuY2hMaXN0ZW5lcik7Ci0JCQotCX0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLSAgICAgICAgTGlzdCBwcm9wcyA9IGZTZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7IAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHByb3BlcnR5LmdldENvbnRleHQoKS5lcXVhbHMoUHJvcGVydHkuQ09OVEVYVF9TRVJWRVIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkgKXsKLSAgICAgICAgICAgICAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKWZDb250cm9scy5nZXQoIHByb3BlcnR5LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgYi5zZXRTZWxlY3Rpb24oICJ0cnVlIi5lcXVhbHMoICBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX1NFTEVDVC5lcXVhbHMoIHByb3BlcnR5LmdldFR5cGUoKSApIHx8ICBQcm9wZXJ0eS5UWVBFX1NFTEVDVF9FRElULmVxdWFscyggcHJvcGVydHkuZ2V0VHlwZSgpICkpewotICAgICAgICAgICAgICAgICAgICBDb21ibyBjID0gKENvbWJvKWZDb250cm9scy5nZXQoIHByb3BlcnR5LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHlWYWx1ZSggcHJvcGVydHkgKT09bnVsbCA/ICIiOiBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIC8vYy5zZXRUZXh0KCBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbmRpbmcgdG8gInZhbHVlIG5vdCB1c2VkIiBtc2csIEknbSBhc3N1bWluZyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdXNlZCBhcyBpbiBmb2xsb3dpbmcgYmxvY2suCi0gICAgICAgICAgICAgICAgICAgIGMuc2V0VGV4dCggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgVGV4dCB0ID0gKFRleHQpZkNvbnRyb2xzLmdldCggcHJvcGVydHkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApPT1udWxsID8gIiI6IGdldFByb3BlcnR5VmFsdWUoIHByb3BlcnR5ICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdC5zZXRUZXh0KCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgZm9ybVRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZm9ybVRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQKLQkJCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQkJc2VjdGlvbi5zZXRUZXh0KEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlNlcnZlckVkaXRvclNlY3Rpb25UaXRsZSk7Ci0JCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlNlcnZlckVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UpKTsKLQkJCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZm9ybVRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPTM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuTk9ORSx0cnVlLGZhbHNlKSk7Ci0JCQotCQlMaXN0IHByb3BzID0gZlNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXRlci5uZXh0KCk7Ci0JCQlpZihwcm9wZXJ0eS5nZXRDb250ZXh0KCkuZXF1YWxzKFByb3BlcnR5LkNPTlRFWFRfU0VSVkVSKSkKLQkJCQljcmVhdGVQcm9wZXJ0eUNvbnRyb2woY29tcG9zaXRlLCBwcm9wZXJ0eSxmb3JtVG9vbGtpdCk7Ci0JCX0KLQotCQlmb3JtVG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkKLQkJCi0JCWlmICggZ2V0RXhpc3RpbmdMYXVuY2goKSAhPSBudWxsICl7Ci0JCQlnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZShNRVNTQUdFX0lEX1NFUlZFUl9SVU5OSU5HLEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlICwgbnVsbCwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlT3BlcmF0aW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotCXsKLSAgICAgICAgaWYoICFmVXBkYXRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmVXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZXhlY3V0ZSggbmV3IFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uKCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlVwZGF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uLCBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgKSApOwotICAgICAgICAgICAgZlVwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSwgRm9ybVRvb2xraXQgdG9vbGtpdCl7Ci0gICAgCQotICAgIAlpZiggUHJvcGVydHkuVFlQRV9ESVJFQ1RPUlkuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJCWZpbmFsIFRleHQgcGF0aCA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZFBhdGgocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgICAgICBmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBwYXRoICk7Ci0gICAgCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsJCQkKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLHBhdGguZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLSAgICAgCX0gZWxzZSBpZiggUHJvcGVydHkuVFlQRV9GSUxFLmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAKLSAgICAJICAgIGZpbmFsIFRleHQgZmlsZSA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZEZpbGUocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgCQlmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBmaWxlICk7Ci0gICAgICAgICAgICBmaWxlLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGZpbGUuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIGZpbmFsIEJ1dHRvbiBib29sID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkQ2hlY2socHJvcGVydHkuZ2V0TGFiZWwoKSwoInRydWUiLmVxdWFscyggZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkpKSxwYXJlbnQsdG9vbGtpdCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJICAgIGZDb250cm9scy5wdXQoIHByb3BlcnR5LmdldElkKCksIGJvb2wgKTsKLSAgICAgICAgICAgIGJvb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLCAgQm9vbGVhbi50b1N0cmluZyhib29sLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIERvIE5vdGhpbmcKLQkJCQl9Ci0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKFByb3BlcnR5LlRZUEVfU0VMRUNULmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eS5nZXREZWZhdWx0KCksIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdG9rZW5Db3VudF07Ci0gICAgCQlpbnQgaSA9MDsKLSAgICAJCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgaTx0b2tlbkNvdW50KXsKLSAgICAJCQl2YWx1ZXNbaV09dG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgIAkJCWkrKzsKLSAgICAJCX0KLSAgICAgICAJCWZpbmFsIENvbWJvIGNvbWJvID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkQ29tYm8ocHJvcGVydHkuZ2V0TGFiZWwoKSwgdmFsdWVzLCBwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgCQlmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBjb21ibyApOwotICAgICAgICAgICAgY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKHByb3BlcnR5LmdldElkKCksY29tYm8uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLSAgICAgICAJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGNvbWJvLmdldFRleHQoKSk7Ci0JCQkJfQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQl9CQkJCi0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKFByb3BlcnR5LlRZUEVfU0VMRUNUX0VESVQuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5LmdldERlZmF1bHQoKSwiLCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQlpbnQgdG9rZW5Db3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotICAgIAkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t0b2tlbkNvdW50XTsKLSAgICAJCWludCBpID0wOwotICAgIAkJd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSAmJiBpPHRva2VuQ291bnQpewotICAgIAkJCXZhbHVlc1tpXT10b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgCQkJaSsrOwotICAgIAkJfQotICAgICAgIAkJZmluYWwgQ29tYm8gY29tYm8gPSBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRFZGl0YWJsZUNvbWJvKHByb3BlcnR5LmdldExhYmVsKCksIHZhbHVlcyxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSwgcGFyZW50LHRvb2xraXQpOwotICAgICAgIAkJZkNvbnRyb2xzLnB1dCggcHJvcGVydHkuZ2V0SWQoKSwgY29tYm8gKTsKLSAgICAgICAgICAgIGNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGNvbWJvLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0gICAgICAgCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWV4ZWN1dGVVcGRhdGVPcGVyYXRpb24ocHJvcGVydHkuZ2V0SWQoKSxjb21iby5nZXRUZXh0KCkpOwotCQkJCX0JCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJfQkJCQotCQkJfSk7CQotICAgICAgIAl9Ci0gICAgICAgCWVsc2UgIHsvLyBQcm9wZXJ0eS5UWVBFX1RFWFQKLSAgICAJICAgIGZpbmFsIFRleHQgZGVmYXVsdFRleHQ9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZFRleHQocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgICAgICBmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBkZWZhdWx0VGV4dCApOwotICAgIAkJZGVmYXVsdFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKHByb3BlcnR5LmdldElkKCksIGRlZmF1bHRUZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCSByZXR1cm4oU3RyaW5nKSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChwcm9wZXJ0eS5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmKCBzZXJ2ZXIhPSBudWxsICkKLSAgICAgICAgICAgIHNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotICAgICAgIAotICAgICAgICBnZXRMYXVuY2hNYW5hZ2VyKCkucmVtb3ZlTGF1bmNoTGlzdGVuZXIoIGZMYXVuY2hMaXN0ZW5lciApOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhdW5jaCBnZXRFeGlzdGluZ0xhdW5jaCgpIHsKLQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IGdldExhdW5jaE1hbmFnZXIoKTsKLQkJCi0JCUlMYXVuY2hbXSBsYXVuY2hlcyA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoZXMoKTsKLQkJaW50IHNpemUgPSBsYXVuY2hlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSBsYXVuY2hlc1tpXS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWlmIChsYXVuY2hDb25maWcgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWcuZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIuQVRUUl9TRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCQkJCQlpZiAoZlNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRJZCgpLmVxdWFscyhzZXJ2ZXJJZCkpIHsKLQkJCQkJCWlmICghbGF1bmNoZXNbaV0uaXNUZXJtaW5hdGVkKCkpCi0JCQkJCQkJcmV0dXJuIGxhdW5jaGVzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hNYW5hZ2VyIGdldExhdW5jaE1hbmFnZXIoKSB7Ci0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlyZXR1cm4gbGF1bmNoTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlKCl7Ci0JCWlmIChnZXRFeGlzdGluZ0xhdW5jaCgpICE9IG51bGwpewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLEdlbmVyaWNVaVBsdWdpbi5QTFVHSU5fSUQsIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlKTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCApewotCQkJSVN0YXR1c1tdIHN0YXR1c0FycmF5ID0ge3N0YXR1c307Ci0JCQlyZXR1cm4gc3RhdHVzQXJyYXk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVTdGF0dXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9VcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9lZGl0b3IvVXBkYXRlU2VydmVyUHJvcGVydHlPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NzQzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9VcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCXByaXZhdGUgR2VuZXJpY1NlcnZlciBmR2VuZXJpY1NlcnZlcjsKLQlwcml2YXRlIFN0cmluZyAgZlByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmUFJvcGVydHlWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmT2xkVmFsdWU7Ci0JCi0JcHVibGljIFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQlzdXBlcihuYW1lKTsKLQkJaWYoc2VydmVyIT1udWxsKXsKLQkJCWZHZW5lcmljU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpc2VydmVyLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXIuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWZQcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lOwotCQlmUFJvcGVydHlWYWx1ZT1wcm9wZXJ0eVZhbHVlOwkKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCggZkdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCkgKTsKLQkJaWYobWFwLmNvbnRhaW5zS2V5KGZQcm9wZXJ0eU5hbWUpKQotCQl7Ci0gICAgICAgICAgICBmT2xkVmFsdWUgPSAoIFN0cmluZyApbWFwLmdldCggZlByb3BlcnR5TmFtZSApOwotCQkJbWFwLnB1dChmUHJvcGVydHlOYW1lLCBmUFJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBmR2VuZXJpY1NlcnZlci5zZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoIG1hcCApOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixHZW5lcmljVWlQbHVnaW4uUExVR0lOX0lELDAsIlByb3BlcnR5IGNhbiBub3QgYmUgZm91bmQiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi0JCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsaW5mbyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcChmR2VuZXJpY1NlcnZlci5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKSk7Ci0JCW1hcC5wdXQoZlByb3BlcnR5TmFtZSwgZk9sZFZhbHVlKTsKLSAgICAgICAgZkdlbmVyaWNTZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKG1hcCk7Ci0JCXJldHVybiBudWxsOwotCQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDkzNmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWRhODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMjAyLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYyNWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4MzcwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SW5zdGFsbGFibGUgc2VydmVyIGFkYXB0ZXJzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIGluc3RhbGxhYmxlIHNlcnZlciBhZGFwdGVycwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYTM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW5zdGFsbGFibGVTZXJ2ZXJzIj4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJvcmcuYXBhY2hlLmdlcm9uaW1vLmdlbmVyaWMucnVudGltZS4xMCIKLSAgICAgIGZlYXR1cmVJZD0ib3JnLmFwYWNoZS5nZXJvbmltby5mZWF0dXJlIgotICAgICAgZmVhdHVyZVZlcnNpb249IjEuMi4wIgotICAgICAgZmVhdHVyZVNpdGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2dlcm9uaW1vL2VjbGlwc2UvdXBkYXRlcy8iLz4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJvcmcuYXBhY2hlLmdlcm9uaW1vLmdlbmVyaWMucnVudGltZS4xMCIKLSAgICAgIGZlYXR1cmVJZD0iY29tLmlibS53ZWJzcGhlcmUuY2UuZmVhdHVyZSIKLSAgICAgIGZlYXR1cmVWZXJzaW9uPSIxLjEuMCIKLSAgICAgIGZlYXR1cmVTaXRlPSJodHRwOi8vZG93bmxvYWQuYm91bGRlci5pYm0uY29tL2libWRsL3B1Yi9zb2Z0d2FyZS93ZWJzcGhlcmUvd2FzY2UvdXBkYXRlcy8iLz4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJjb20ucHJhbWF0aSIKLSAgICAgIGZlYXR1cmVJZD0iY29tLnByYW1hdGkuZWNsaXBzZS5mZWF0dXJlIgotICAgICAgZmVhdHVyZVZlcnNpb249IjEuMC4wIgotICAgICAgZmVhdHVyZVNpdGU9Imh0dHA6Ly93d3cucHJhbWF0aS5jb20vZG93bmxvYWRzL2VjbGlwc2UvdXBkYXRlcy8iLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGIwYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc4OGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NDVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUdlbmVyaWMgc2VydmVyIFBERSBUZW1wbGF0ZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuU2VydmVyUGRlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucGRlLnVpLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5MzE4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlc18zLjAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2J1aWxkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdmMTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIiBkZWZhdWx0PSJidWlsZC5qYXJzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJiYXNld3MiIHZhbHVlPSIke3dzfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlb3MiIHZhbHVlPSIke29zfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlYXJjaCIgdmFsdWU9IiR7YXJjaH0iLz4KLQk8cHJvcGVydHkgbmFtZT0iYmFzZW5sIiB2YWx1ZT0iJHtubH0iLz4KLQotCTwhLS0gQ29tcGlsZXIgc2V0dGluZ3MuIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY0ZhaWxPbkVycm9yIiB2YWx1ZT0iZmFsc2UiLz4KLQk8cHJvcGVydHkgbmFtZT0iamF2YWNEZWJ1Z0luZm8iIHZhbHVlPSJvbiIvPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY1ZlcmJvc2UiIHZhbHVlPSJ0cnVlIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjU291cmNlIiB2YWx1ZT0iMS4zIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjVGFyZ2V0IiB2YWx1ZT0iMS4yIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImNvbXBpbGVyQXJnIiB2YWx1ZT0iIi8+Ci0JPHBhdGggaWQ9InBhdGhfYm9vdGNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtqYXZhLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCTxwcm9wZXJ0eSBuYW1lPSJib290Y2xhc3NwYXRoIiByZWZpZD0icGF0aF9ib290Y2xhc3NwYXRoIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtidWlsZFRlbXBGb2xkZXJ9L3BsdWdpbnMiPgotCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZFRlbXBGb2xkZXIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtwbHVnaW5UZW1wfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIj4KLQkJCTxpc3NldCBwcm9wZXJ0eT0iYnVpbGRUZW1wRm9sZGVyIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQudXBkYXRlLmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIGZvciBhbiB1cGRhdGUgc2l0ZS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZpbGVzb25seT0iZmFsc2UiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQGRvdCIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJAZG90IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGphcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSBAZG90LiI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbiIvPgotCQk8IS0tIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIC0tPgotCQk8amF2YWMgZGVzdGRpcj0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4iIGZhaWxvbmVycm9yPSIke2phdmFjRmFpbE9uRXJyb3J9IiB2ZXJib3NlPSIke2phdmFjVmVyYm9zZX0iIGRlYnVnPSIke2phdmFjRGVidWdJbmZvfSIgaW5jbHVkZUFudFJ1bnRpbWU9Im5vIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiBzb3VyY2U9IiR7amF2YWNTb3VyY2V9IiB0YXJnZXQ9IiR7amF2YWNUYXJnZXR9IgkJPgotCQkJPGNvbXBpbGVyYXJnIGxpbmU9IiR7Y29tcGlsZXJBcmd9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5zd3RfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODZfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2hfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5XzMuMS4wL2NvbXBhdGliaWxpdHkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5XzMuMS4wL0Bkb3QiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuYW50LmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS5wZGUudWkvZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS5wZGUudWkvb3JnLmVjbGlwc2UucGRlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5pZGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS52aWV3c18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmZvcm1zXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZmFjZS50ZXh0XzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS50ZXh0XzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuZWRpdG9yc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVyc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZGVidWcuY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZGVidWcudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmNvbnNvbGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5jb3JlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS50ZWFtLmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmRlYnVnXzMuMS4wL2pkaS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmRlYnVnXzMuMS4wL2pkaW1vZGVsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZHQuZGVidWdfMy4xLjAvdG9vbHMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmdfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uuc2VhcmNoXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb21wYXJlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZ18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5wZGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnBkZS5jb3JlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfMy4xLjAvcGRlYnVpbGQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYW50bHIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLWJjZWwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtbG9nNGouamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLW9yby5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWFwYWNoZS1yZXNvbHZlci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1jb21tb25zLWxvZ2dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtY29tbW9ucy1uZXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtaWNvbnRyYWN0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWphaS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qYXZhbWFpbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qZGVwZW5kLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWptZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qc2NoLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWp1bml0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWxhdW5jaGVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LW5ldHJleHguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtbm9kZXBzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXN0YXJ0ZWFtLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXN0eWxlYm9vay5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1zd2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC10cmF4LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXZhai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC13ZWJsb2dpYy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC14YWxhbjEuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQteHNscC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFudGxyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtYmNlbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtYXBhY2hlLWxvZzRqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtb3JvLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtY29tbW9ucy1uZXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWljb250cmFjdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtamFpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qYXZhbWFpbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtamRlcGVuZC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtam1mLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qc2NoLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qdW5pdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtbGF1bmNoZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LW5ldHJleHguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LW5vZGVwcy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtc3RhcnRlYW0uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXN0eWxlYm9vay5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtc3dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXRyYXguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXZhai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtd2VibG9naWMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXhhbGFuMS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQteHNscC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL0Bkb3QiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmp1bml0XzMuOC4xL2p1bml0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5hbnQudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5qdW5pdF8zLjEuMC9qdW5pdHN1cHBvcnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5qdW5pdC5ydW50aW1lXzMuMS4wL2p1bml0cnVudGltZS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuaW50cm9fMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwLmJhc2VfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUubHVjZW5lXzEuNC4zL2x1Y2VuZS0xLjQuMy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5sdWNlbmVfMS40LjMvcGFyc2VyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcl8zLjEuMC5qYXIiLz4KLQkJCTwvY2xhc3NwYXRoPgotCQkJPHNyYyBwYXRoPSJzcmMvIgkJCS8+Ci0JCQk8L2phdmFjPgotCQk8IS0tIENvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9InNyYy8iIGV4Y2x1ZGVzPSIqKi8qLmphdmEsICoqL3BhY2thZ2UuaHRtKixudWxsIgkJCS8+Ci0JCTwvY29weT4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9AZG90IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIgkJCS8+Ci0JCTwvY29weT4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InNyYy56aXAiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0ic3JjLnppcCI+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iLz4KLQkJPHppcCBkZXN0ZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9zcmMuemlwIiBmaWxlc29ubHk9ImZhbHNlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSJzcmMvIiBpbmNsdWRlcz0iKiovKi5qYXZhIgkJCS8+Ci0JCTwvemlwPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5qYXJzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRoZSBqYXJzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS4iPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJAZG90IiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L0Bkb3QiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJAZG90Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnNvdXJjZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJzcmMuemlwIiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3NyYy56aXAiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJzcmMuemlwIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5iaW4ucGFydHMiIGRlcGVuZHM9ImluaXQiIGlmPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9AZG90IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTUVUQS1JTkYvLG51bGwscGx1Z2luLnhtbCx0ZW1wbGF0ZXNfMy4wLyxpY29ucy8scGx1Z2luLnByb3BlcnRpZXMsYnVpbGQucHJvcGVydGllcyIJCQkvPgotCQk8L2NvcHk+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnppcHMiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXIuc291cmNlcyIgZGVwZW5kcz0iaW5pdCIgaWY9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIvPgotCQk8Y29weSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3NyYy56aXAiIHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wIiBmYWlsb25lcnJvcj0iZmFsc2UiIG92ZXJ3cml0ZT0iZmFsc2UiLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJzcmMvIgkJCS8+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmxvZ3MiIGRlcGVuZHM9ImluaXQiIGlmPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiLz4KLQkJPGNvcHkgZmlsZT0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4ubG9nIiB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdmVyd3JpdGU9ImZhbHNlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQ2xlYW4gdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUgb2YgYWxsIHRoZSB6aXBzLCBqYXJzIGFuZCBsb2dzIGNyZWF0ZWQuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vQGRvdCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vc3JjLnppcCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7cGx1Z2luLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wLmphciIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7cGx1Z2luLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wLnppcCIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyIgZGVzY3JpcHRpb249IlJlZnJlc2ggdGhpcyBmb2xkZXIuIj4KLQkJPGVjbGlwc2UuY29udmVydFBhdGggZmlsZVN5c3RlbVBhdGg9IkQ6L19iZ2Uvd29ya3NwYWNlcy93b3Jrc3BhY2Uvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSIgcHJvcGVydHk9InJlc291cmNlUGF0aCIvPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cmVzb3VyY2VQYXRofSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InppcC5wbHVnaW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSB6aXAgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQuc291cmNlcyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5iaW4ucGFydHMiPgotCQkJPHBhcmFtIG5hbWU9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXIuc291cmNlcyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke3RlbXAuZm9sZGVyfSIgaW5jbHVkZXM9IioqLyouYmluLmxvZyIJCQkvPgotCQk8L2RlbGV0ZT4KLQkJPHppcCBkZXN0ZmlsZT0iJHtwbHVnaW4uZGVzdGluYXRpb259L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAuemlwIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfSIgZmlsZXNvbmx5PSJ0cnVlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2ljb25zL29iajE2L3dpel9uZXdfc2VydmVyX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OWE1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBHZW5lcmljIHNlcnZlciBQREUgVGVtcGxhdGUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotdGVtcGxhdGUuZ2VuZXJpY1NlcnZlci5uYW1lPUdlbmVyaWMgU2VydmVyIFBsdWdpbiBXaXphcmQKLXRlbXBsYXRlLmdlbmVyaWNTZXJ2ZXIuZGVzY3JpcHRpb249XAotPHA+VGhpcyB3aXphcmQgY3JlYXRlcyBhIHNpbXBsZSBnZW5lcmljIHNlcnZlciBwbHVnLWluLiBcCi1UaGUgLnNlcnZlcmRlZiBmaWxlIGFuZCB0aGUgYnVpbGQueG1sIGZpbGUgZm9yIEFOVCBiYXNlZCBwdWJsaXNoaW5nIGFyZSBjcmVhdGVkLiBcCi1DcmVhdGVkIGZpbGVzIGFyZSB0aGUgc2FtZSBmaWxlcyB1c2VkIGZvciBKQm9zcyAzLjIuMyBpbiBHZW5lcmljIEV4YW1wbGVzLiBcCi08L3A+XAotPHA+PGI+RXh0ZW5zaW9uIFVzZWQ8L2I+PC9wPlwKLTxsaT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uPC9saT4gXAotPGxpPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVGFyZ2V0SGFuZGxlcnM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzPC9saT4gXAotPGxpPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXM8L2xpPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxOGE0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wZGUudWkucGx1Z2luQ29udGVudCI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0iV1RQIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL29iajE2L3dpel9uZXdfc2VydmVyX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5nZW5lcmljU2VydmVyIgotICAgICAgICAgICAgamF2YT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiV0ZW1wbGF0ZS5nZW5lcmljU2VydmVyLm5hbWUiCi0gICAgICAgICAgICByY3A9ImZhbHNlIgotICAgICAgICAgICAgdWktY29udGVudD0idHJ1ZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAldGVtcGxhdGUuZ2VuZXJpY1NlcnZlci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL1NlcnZlclBkZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9TZXJ2ZXJQZGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkODc3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL1NlcnZlclBkZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUGRlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyUGRlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZlclBkZVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclBkZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJQbHVnaW5OZXdXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RhNGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUudWkuSUZpZWxkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUudWkudGVtcGxhdGVzLklUZW1wbGF0ZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5OZXdQbHVnaW5UZW1wbGF0ZVdpemFyZDsKLS8qKgotICogTmV3IEdlbmVyaWMgc2VydmVyIHBsdWctaW4gd2l6YXJkLiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZCBleHRlbmRzIE5ld1BsdWdpblRlbXBsYXRlV2l6YXJkIHsKLQotCXB1YmxpYyBJVGVtcGxhdGVTZWN0aW9uW10gY3JlYXRlVGVtcGxhdGVTZWN0aW9ucygpewotCQlyZXR1cm4gbmV3IElUZW1wbGF0ZVNlY3Rpb25bXSB7bmV3IEdlbmVyaWNTZXJ2ZXJUZW1wbGF0ZSgpfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJRmllbGREYXRhIGRhdGEpIHsKLQkJc3VwZXIuaW5pdChkYXRhKTsKLQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2luZG93VGl0bGVXaXphcmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJhYzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5TZXJ2ZXJQZGVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5CYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpbk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkud2l6YXJkcy50ZW1wbGF0ZXMuUGx1Z2luUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMuT3B0aW9uVGVtcGxhdGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMuVGVtcGxhdGVPcHRpb247Ci0vKioKLSAqIFNpbXBsZSBnZW5lcmljIHNlcnZlciBwbHVnLWluIHRlbXBsYXRlCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclRlbXBsYXRlIGV4dGVuZHMgT3B0aW9uVGVtcGxhdGVTZWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX1ZFUlNJT04gPSAic2VydmVyX3ZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfU1RBUlRfQkVGT1JFX1BVQkxJU0ggPSAic2VydmVyX3N0YXJ0X2JlZm9yZV9wdWJsaXNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX0xBVU5DSFRZUEUgPSAic2VydmVyX2xhdW5jaHR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfVkVORE9SID0gInNlcnZlcl92ZW5kb3IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfREVTQ1JJUFRJT04gPSAic2VydmVyX2Rlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX05BTUUgPSAic2VydmVyX25hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBsYXVuY2hPcHRzID0ge3siamF2YSIsTWVzc2FnZXMubGFiZWxKYXZhTGF1bmNoQ29uZmlndXJhdGlvbn0seyJleHRlcm5hbCIsTWVzc2FnZXMubGFiZWxFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb259fTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCi0JCi0JcHJpdmF0ZSBUZW1wbGF0ZU9wdGlvbiBmU2VydmVyTmFtZU9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJEZXNjcmlwdGlvbk9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJWZW5kb3JPcHRpb247Ci0JcHJpdmF0ZSBUZW1wbGF0ZU9wdGlvbiBmU2VydmVyVmVyc2lvbk9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZMYXVuY2hUeXBlT3B0aW9uOwotCXByaXZhdGUgVGVtcGxhdGVPcHRpb24gZlN0YXJ0QmVmb3JQdWJsaXNoT3B0aW9uOwotCQotCXB1YmxpYyBHZW5lcmljU2VydmVyVGVtcGxhdGUoKSB7Ci0JCXNldFBhZ2VDb3VudCgxKTsKLQkJY3JlYXRlT3B0aW9ucygpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT3B0aW9ucygpewotCQotCQlmU2VydmVyTmFtZU9wdGlvbj0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfTkFNRSxNZXNzYWdlcy5sYWJlbFNlcnZlck5hbWUsInlvdXIgc2VydmVyJ3MgbmFtZSIsMCk7IC8vJE5PTi1OTFMtMiQKLQkJZlNlcnZlckRlc2NyaXB0aW9uT3B0aW9uID0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfREVTQ1JJUFRJT04sIkRlc2NyaXB0aW9uIiwiVXNlciBkZXNjcmlwdGlvbiBvZiB5b3VyIHNlcnZlciIsMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmU2VydmVyVmVuZG9yT3B0aW9uPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9WRU5ET1IsTWVzc2FnZXMubGFiZWxTZXJ2ZXJWZW5kb3IsIlNlcnZlciB2ZW5kb3InIHMgbmFtZSIsMCk7IC8vJE5PTi1OTFMtMiQKLQkJZlNlcnZlclZlcnNpb25PcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX1ZFUlNJT04sTWVzc2FnZXMubGFiZWxTZXJ2ZXJWZXNpb24sIjAiLDApOyAvLyROT04tTkxTLTIkCi0JCWZMYXVuY2hUeXBlT3B0aW9uPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9MQVVOQ0hUWVBFLE1lc3NhZ2VzLmxhYmVsTGF1bmNoVHlwZSxsYXVuY2hPcHRzLCJqYXZhIiwwKTsgLy8kTk9OLU5MUy0yJAotCQlmU3RhcnRCZWZvclB1Ymxpc2hPcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX1NUQVJUX0JFRk9SRV9QVUJMSVNILE1lc3NhZ2VzLmxhYmVsU3RhcnRCZWZvcmVQdWJsaXNoLGZhbHNlLDApOwotCQkKLQkJZlNlcnZlck5hbWVPcHRpb24uc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JCWZTZXJ2ZXJEZXNjcmlwdGlvbk9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQkJZlNlcnZlclZlbmRvck9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQkJZlNlcnZlclZlcnNpb25PcHRpb24uc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbklkKCkgewotCQlyZXR1cm4gImdlbmVyaWNzZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJSVBsdWdpbkJhc2UgcGx1Z2luID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOwotCQlJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBtb2RlbC5nZXRQbHVnaW5GYWN0b3J5KCk7CQkKLQkJYWRkUnVudGltZVR5cGUocGx1Z2luLCBmYWN0b3J5KTsKLQkJYWRkU2VydmVyVHlwZShwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRXaXphcmRGcmFnbWVudChwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRTZXJ2ZXJJbWFnZShwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRSdW50aW1lVGFyZ2V0SGFuZGxlcihwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRTZXJ2ZXJEZWZpbml0aW9uKHBsdWdpbiwgZmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZlckRlZmluaXRpb24oSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiBkZWZpbml0aW9uRXh0ZW5zaW9uID0gY3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBzZXJ2ZXJEZWYgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoZGVmaW5pdGlvbkV4dGVuc2lvbik7Ci0JCXNlcnZlckRlZi5zZXROYW1lKCJzZXJ2ZXJkZWZpbml0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyRGVmLnNldEF0dHJpYnV0ZSgiaWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJEZWYuc2V0QXR0cmlidXRlKCJkZWZpbml0aW9uZmlsZSIsIi9zZXJ2ZXJzLyIrZ2V0U3RyaW5nT3B0aW9uKEtFWV9TRVJWRVJfTkFNRSkrIi5zZXJ2ZXJkZWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZGVmaW5pdGlvbkV4dGVuc2lvbi5hZGQoc2VydmVyRGVmKTsKLQkJaWYoIWRlZmluaXRpb25FeHRlbnNpb24uaXNJblRoZU1vZGVsKCkpCi0JCQlwbHVnaW4uYWRkKGRlZmluaXRpb25FeHRlbnNpb24pOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJ1bnRpbWVUYXJnZXRIYW5kbGVyKElQbHVnaW5CYXNlIHBsdWdpbiwgSVBsdWdpbk1vZGVsRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQbHVnaW5FeHRlbnNpb24gaGFuZGxlckV4dGVuc2lvbiA9IGNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXRIYW5kbGVycyIsdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVBsdWdpbkVsZW1lbnQgaGFuZGxlcj0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KGhhbmRsZXJFeHRlbnNpb24pOwotCQloYW5kbGVyLnNldE5hbWUoInJ1bnRpbWVUYXJnZXRIYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaGFuZGxlci5zZXRBdHRyaWJ1dGUoImlkIixnZXROYW1lc3BhY2UoKSsiLnJ1bnRpbWVUYXJnZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWhhbmRsZXIuc2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCWhhbmRsZXIuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaGFuZGxlckV4dGVuc2lvbi5hZGQoaGFuZGxlcik7Ci0JCWlmKCFoYW5kbGVyRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChoYW5kbGVyRXh0ZW5zaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXJ2ZXJJbWFnZShJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIGltYWdlRXh0ZW5zaW9uID0gY3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlcyIsdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVBsdWdpbkVsZW1lbnQgc2VydmVySW1hZ2UgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoaW1hZ2VFeHRlbnNpb24pOwotCQlzZXJ2ZXJJbWFnZS5zZXROYW1lKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIuc2VydmVySW1hZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgiaWNvbiIsImljb25zL3NlcnZlci5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgidHlwZUlkcyIsZ2V0U2VydmVySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW1hZ2VFeHRlbnNpb24uYWRkKHNlcnZlckltYWdlKTsKLQkJCi0JCUlQbHVnaW5FbGVtZW50IHJ1bnRpbWVJbWFnZSA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChpbWFnZUV4dGVuc2lvbik7Ci0JCXJ1bnRpbWVJbWFnZS5zZXROYW1lKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVJbWFnZS5zZXRBdHRyaWJ1dGUoImlkIixnZXROYW1lc3BhY2UoKSsiLnJ1bnRpbWVJbWFnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZUltYWdlLnNldEF0dHJpYnV0ZSgiaWNvbiIsImljb25zL3NlcnZlci5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJ1bnRpbWVJbWFnZS5zZXRBdHRyaWJ1dGUoInR5cGVJZHMiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpbWFnZUV4dGVuc2lvbi5hZGQocnVudGltZUltYWdlKTsKLQkJaWYoIWltYWdlRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChpbWFnZUV4dGVuc2lvbik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkV2l6YXJkRnJhZ21lbnQoSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiB3aXphcmRFeHRlbnNpb24gPSBjcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBydW50aW1lV2l6ID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHdpemFyZEV4dGVuc2lvbik7Ci0JCXJ1bnRpbWVXaXouc2V0TmFtZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lV2l6LnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIucnVudGltZVdpemFyZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZVdpei5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJ1bnRpbWVXaXouc2V0QXR0cmlidXRlKCJ0eXBlSWRzIixnZXRSdW50aW1lSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkRXh0ZW5zaW9uLmFkZChydW50aW1lV2l6KTsKLQkJaWYoIXdpemFyZEV4dGVuc2lvbi5pc0luVGhlTW9kZWwoKSkKLQkJCXBsdWdpbi5hZGQod2l6YXJkRXh0ZW5zaW9uKTsKLQkJCi0JCUlQbHVnaW5FbGVtZW50IHNlcnZlcldpeiA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh3aXphcmRFeHRlbnNpb24pOwotCQlzZXJ2ZXJXaXouc2V0TmFtZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJXaXouc2V0QXR0cmlidXRlKCJpZCIsZ2V0TmFtZXNwYWNlKCkrIi5zZXJ2ZXJXaXphcmQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHNlcnZlcldpei5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudCIpOyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyV2l6LnNldEF0dHJpYnV0ZSgidHlwZUlkcyIsZ2V0U2VydmVySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkRXh0ZW5zaW9uLmFkZChzZXJ2ZXJXaXopOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZlclR5cGUoSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiBzZXJ2ZXJFeHRlbnNpb24gPWNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBzZXJ2ZXJUeXBlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHNlcnZlckV4dGVuc2lvbik7Ci0JCXNlcnZlclR5cGUuc2V0TmFtZSgic2VydmVyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJydW50aW1lIiwidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImlkIixnZXRTZXJ2ZXJJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiaW5pdGlhbFN0YXRlIiwic3RvcHBlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInN1cHBvcnRzUmVtb3RlSG9zdHMiLCJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX0RFU0NSSVBUSU9OKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImxhdW5jaENvbmZpZ0lkIixnZXRTZWxlY3RlZENvbmZpZ1R5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImJlaGF2aW91ckNsYXNzIixnZXRTZWxlY3RlZEJlaGF2aW91ckNsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJuYW1lIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9OQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInN0YXJ0VGltZW91dCIsIjc1MDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3RvcFRpbWVvdXQiLCIzMDAwMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImhhc0NvbmZpZ3VyYXRpb24iLCJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImxhdW5jaE1vZGVzIiwicnVuLGRlYnVnIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3RhcnRCZWZvcmVQdWJsaXNoIiwgQm9vbGVhbi50b1N0cmluZyhnZXRCb29sZWFuT3B0aW9uKEtFWV9TRVJWRVJfU1RBUlRfQkVGT1JFX1BVQkxJU0gpKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyRXh0ZW5zaW9uLmFkZChzZXJ2ZXJUeXBlKTsKLQkJaWYoIXNlcnZlckV4dGVuc2lvbi5pc0luVGhlTW9kZWwoKSkKLQkJCXBsdWdpbi5hZGQoc2VydmVyRXh0ZW5zaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRSdW50aW1lVHlwZShJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIGV4dGVuc2lvbiA9Y3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBydW50aW1lVHlwZSA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChleHRlbnNpb24pOwotCQlydW50aW1lVHlwZS5zZXROYW1lKCJydW50aW1lVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgiaWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX05BTUUpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9ERVNDUklQVElPTikpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgidmVuZG9yIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9WRU5ET1IpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX1ZFUlNJT04pKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlJUGx1Z2luRWxlbWVudCBtb2R1bGVUeXBlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHJ1bnRpbWVUeXBlKTsKLQkJbW9kdWxlVHlwZS5zZXROYW1lKCJtb2R1bGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJbW9kdWxlVHlwZS5zZXRBdHRyaWJ1dGUoInR5cGVzIiwianN0LndlYiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgbW9kdWxlVHlwZS5zZXRBdHRyaWJ1dGUoInZlcnNpb25zIiwiMS4yLCAxLjMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJ1bnRpbWVUeXBlLmFkZChtb2R1bGVUeXBlKTsKLSAgICAgICAgCi0JCWV4dGVuc2lvbi5hZGQocnVudGltZVR5cGUpOwotCQlpZighZXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChleHRlbnNpb24pOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lSWQoKXsKLQkJcmV0dXJuIGdldE5hbWVzcGFjZSgpKyIucnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmVySWQoKXsKLQkJcmV0dXJuIGdldE5hbWVzcGFjZSgpKyIuc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoKQotCXsKLQkJcmV0dXJuIG1vZGVsLmdldFBsdWdpbkJhc2UoKS5nZXRJZCgpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZEJlaGF2aW91ckNsYXNzKCkgewotCQlpZihpc0V4dGVybmFsU2VsZWN0ZWQoKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuRXh0ZXJuYWxTZXJ2ZXJCZWhhdmlvdXIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeHRlcm5hbFNlbGVjdGVkKCl7Ci0JCVN0cmluZyBzZWxlY3RlZFR5cGUgPSBnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9MQVVOQ0hUWVBFKTsKLQkJcmV0dXJuICJleHRlcm5hbCIuZXF1YWxzKHNlbGVjdGVkVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZENvbmZpZ1R5cGUoKXsKLQkJaWYoaXNFeHRlcm5hbFNlbGVjdGVkKCkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRQbHVnaW5SZXNvdXJjZUJ1bmRsZSgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldE5ld0ZpbGVzKCl7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Imljb25zLyIsICJzZXJ2ZXIvIiwiYnVpbGRmaWxlcy8ifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZWRFeHRlbnNpb25Qb2ludCgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVPcHRpb25zKFRlbXBsYXRlT3B0aW9uIGNoYW5nZWQpewotCQlpZihjaGFuZ2VkLmlzUmVxdWlyZWQoKSAmJiBjaGFuZ2VkLmlzRW1wdHkoKSl7Ci0JCQlmbGFnTWlzc2luZ1JlcXVpcmVkT3B0aW9uKGNoYW5nZWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRlbXBsYXRlT3B0aW9uW10gb3B0aW9ucyA9IGdldE9wdGlvbnMoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYob3B0aW9uc1tpXS5pc1JlcXVpcmVkKCkgJiYgb3B0aW9uc1tpXS5pc0VtcHR5KCkpewotCQkJCWZsYWdNaXNzaW5nUmVxdWlyZWRPcHRpb24ob3B0aW9uc1tpXSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlc2V0UGFnZVN0YXRlKCk7Ci0JfQotCQotCQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKFdpemFyZCB3aXphcmQpIHsKLQkJV2l6YXJkUGFnZSBwYWdlID0gY3JlYXRlUGFnZSgwKTsKLQkJcGFnZS5zZXRUaXRsZShNZXNzYWdlcy5wYWdlVGl0bGUpOwotCQlwYWdlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnBhZ2VEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5hZGRQYWdlKHBhZ2UpOwotCQltYXJrUGFnZXNBZGRlZCgpOwotCX0KLQkKLQkKLSAKLQlwcm90ZWN0ZWQgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBTZXJ2ZXJQZGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5BYnN0cmFjdFRlbXBsYXRlU2VjdGlvbiNnZXREZXBlbmRlbmNpZXMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBsdWdpblJlZmVyZW5jZVtdIGdldERlcGVuZGVuY2llcyhTdHJpbmcgc2NoZW1hVmVyc2lvbikgewotCQlJUGx1Z2luUmVmZXJlbmNlW10gZGVwID0gbmV3IElQbHVnaW5SZWZlcmVuY2VbNF07Ci0JCWRlcFswXSA9IG5ldyBQbHVnaW5SZWZlcmVuY2UoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIsIG51bGwsIDApOyAvLyROT04tTkxTLTEkCi0JCWRlcFsxXSA9IG5ldyBQbHVnaW5SZWZlcmVuY2UoIm9yZy5lY2xpcHNlLnVpIiwgbnVsbCwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVwWzJdID0gbmV3IFBsdWdpblJlZmVyZW5jZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiLCBudWxsLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlkZXBbM10gPSBuZXcgUGx1Z2luUmVmZXJlbmNlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiLCBudWxsLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVwOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSh2YXJpYWJsZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjM1N2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbEphdmFMYXVuY2hDb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFNlcnZlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFNlcnZlclZlbmRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsU2VydmVyVmVzaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxMYXVuY2hUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxTdGFydEJlZm9yZVB1Ymxpc2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dUaXRsZVdpemFyZDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MGNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWxhYmVsSmF2YUxhdW5jaENvbmZpZ3VyYXRpb249SmF2YSBsYXVuY2ggY29maWd1cmF0aW9uCi1sYWJlbEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbj1FeHRlcm5hbCBsYXVuY2ggY29uZmlndXJhdGlvbgotbGFiZWxTZXJ2ZXJOYW1lPVNlcnZlciBOYW1lCi1sYWJlbFNlcnZlclZlbmRvcj1TZXJ2ZXIgVmVuZG9yCi1sYWJlbFNlcnZlclZlc2lvbj1TZXJ2ZXIgVmVyc2lvbgotbGFiZWxMYXVuY2hUeXBlPUxhdW5jaCB0eXBlCi1sYWJlbFN0YXJ0QmVmb3JlUHVibGlzaD1TdGFydCBCZWZvcmUgcHVibGlzaAotcGFnZVRpdGxlPUdlbmVyaWMgU2VydmVyIFBsdWctaW4KLXBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgR2VuZXJpYyBzZXJ2ZXIgcGx1Zy1pbgotd2luZG93VGl0bGVXaXphcmQ9TmV3IEdlbmVyaWMgU2VydmVyIHBsdWctaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2J1aWxkZmlsZXMvJHNlcnZlcl9uYW1lJC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9idWlsZGZpbGVzLyRzZXJ2ZXJfbmFtZSQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzIwY2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2J1aWxkZmlsZXMvJHNlcnZlcl9uYW1lJC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotICAJCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS5lamIiPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVhciI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCSAgICAgICAJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC96aXBmaWxlc2V0PgotCQk8L2phcj4KLSAgCQk8bW92ZSBmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciIgdG9kaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiA8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTxkZWxldGUgZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IDwvZGVsZXRlPgotCTwvdGFyZ2V0PgkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9pY29ucy9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvaWNvbnMvc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9pY29ucy9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvc2VydmVycy8kc2VydmVyX25hbWUkLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL3NlcnZlcnMvJHNlcnZlcl9uYW1lJC5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjg3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvc2VydmVycy8kc2VydmVyX25hbWUkLnNlcnZlcmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRuczpTZXJ2ZXJSdW50aW1lCi0JeG1sbnM6dG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIFNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCAiCi0JbmFtZT0iSkJPU1MgMy4yLjMiIHZlcnNpb249InYzLjIuMyI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzLTMuMi4zIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJDb25maWciCi0JbGFiZWw9IiVqYm9zczMyM3NlcnZlckNvbmZpZyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9ImRlZmF1bHQiIC8+Ci08cHJvcGVydHkgaWQ9ImNsYXNzUGF0aCIKLQlsYWJlbD0iJXNlcnZlcmNsYXNzUGF0aCIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzLTMuMi4zIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4kJHtwb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLmVqYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnByb2plY3Q8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3Byb2plY3Q+Ci0JCi0JPHN0YXJ0PgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5NYWluPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiQke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJCR7c2VydmVyQ29uZmlnfTwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tUzwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL2pib3NzMzIzLnhtbDwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmoyZWUud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guajJlZS5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmoyZWUud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmoyZWUuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qMmVlLmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guajJlZS5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkJCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MiID4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9iaW4vcnVuLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9iaW4vc2h1dGRvd24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2NsaWVudC9qYm9zcy1qMmVlLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamF2YXguc2VydmxldC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2pib3NzLWJvb3QuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1zeXN0ZW0uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1qbXguamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1jb21tb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9jb25jdXJyZW50LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamJvc3MuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qbnBzZXJ2ZXIuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qcGwtcGF0dGVybi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vbGliL2pwbC11dGlsLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamJvc3MtdHJhbnNhY3Rpb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9iY2VsLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9saWIvamRvbS5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL3hlcmNlc0ltcGwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi94bWwtYXBpcy5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2dudS1yZWdleHAuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9nZXRvcHQuamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MucHJvamVjdCIgPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2NsaWVudC9qYm9zcy1qMmVlLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvZGVmYXVsdC9saWIvamF2YXguc2VydmxldC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyL2RlZmF1bHQvbGliL2FjdGl2YXRpb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQk8am5kaUNvbm5lY3Rpb24+Ci0JCTxwcm92aWRlclVybD5qbnA6Ly8kJHtzZXJ2ZXJBZGRyZXNzfToxMDk5PC9wcm92aWRlclVybD4KLQkJPGluaXRpYWxDb250ZXh0RmFjdG9yeT5vcmcuam5wLmludGVyZmFjZXMuTmFtaW5nQ29udGV4dEZhY3Rvcnk8L2luaXRpYWxDb250ZXh0RmFjdG9yeT4KLQkJPGpuZGlQcm9wZXJ0eT4KLQkJCTxuYW1lPjwvbmFtZT4KLQkJCTx2YWx1ZT48L3ZhbHVlPgotCQk8L2puZGlQcm9wZXJ0eT4KLQk8L2puZGlDb25uZWN0aW9uPgotPC90bnM6U2VydmVyUnVudGltZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1MDU1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1zcmMuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWYwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wdWJsaXNoaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjdjZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEZlYiAyMyAyMToxNTozOCBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDc1OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuUHJldmlld1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMTAwLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmMDhiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2ljb25zL29iajE2L3ByZXZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2ljb25zL29iajE2L3ByZXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDA3NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUpFRSBQcmV2aWV3IFNlcnZlciBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotcHJldmlld1J1bnRpbWVUeXBlTmFtZT1KMkVFIFByZXZpZXcKLXByZXZpZXdSdW50aW1lVHlwZURlc2NyaXB0aW9uPUEgcnVudGltZSBmb3IgYnVpbGRpbmcgSjJFRSB3ZWIgbW9kdWxlcy4KLQotcHJldmlld1NlcnZlclR5cGVOYW1lPUoyRUUgUHJldmlldwotcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbj1BIHNlcnZlciB0byBwcmV2aWV3IEoyRUUgd2ViIG1vZHVsZXMuCi0KLXByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVHlwZT1KMkVFIFByZXZpZXcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjJjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBuYW1lPSIlcHJldmlld1J1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXByZXZpZXdSdW50aW1lVHlwZURlc2NyaXB0aW9uIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwyLjMsMi40LDIuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNlcnZlciIKLSAgICAgICBuYW1lPSIlcHJldmlld1NlcnZlclR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZVRhcmdldCIKLSAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHZlcnNpb249IjEuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJ3c3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjZXQgaWQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9kZWZhdWx0LWZhY2V0cz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXJzIj4KLSAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNvdXJjZVBhdGhDb21wdXRlciIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmUuUHJldmlld1NvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVwcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIKLSAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNvdXJjZVBhdGhDb21wdXRlciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXciCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotPCEtLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU3RhcnR1cCI+Ci0gIDxzdGFydHVwCi0gICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5zdGFydHVwIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucHJldmlldy5QcmV2aWV3U3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0tLT4KLQotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXciCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lLG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5zZXJ2ZXIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBwYXRoPSJpY29ucy9vYmoxNi9wcmV2aWV3LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5GYWNldFJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgICBjb25maWdUeXBlSUQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLnVpLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9JTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZhMmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYThmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3B5aW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNyZWF0aW5nWmlwRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckZhY2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGVsZXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb3RBRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWtkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdFNlcnZsZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RFSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RKTkRJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0Q2FjdHVzVGVzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbk1vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1Byb2ZpbGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjNmNlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQotY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCi0KLWVycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KLWVycm9ySlJFPUludmFsaWQgSlJFLgotCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KLWVycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9Ci1lcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgotZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KLWVycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KLWVycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQotCi1hcnRpZmFjdFNlcnZsZXQ9U2VydmxldCB7MH0KLWFydGlmYWN0RUpCPUVKQiB7MH0KLWFydGlmYWN0Sk5EST1KTkRJIHswfQotYXJ0aWZhY3RDYWN0dXNUZXN0PUNhY3R1cyB0ZXN0IHswfQotCi1jYW5Nb2RpZnlNb2R1bGVzPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vUHJvZmlsZXI9Q291bGQgbm90IGxhdW5jaCBpbiBwcm9maWxpbmcgbW9kZSBiZWNhdXNlIG5vIHByb2ZpbGVycyBhcmUgY29uZmlndXJlZC4KLWVycm9yUHVibGlzaD1BbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwdWJsaXNoaW5nLgotaHR0cFBvcnQ9SFRUUCBQb3J0Ci1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1ByZXZpZXdQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1ByZXZpZXdQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyMGYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9QcmV2aWV3UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogVGhlIG1haW4gcHJldmlldyBzZXJ2ZXIgdG9vbHMgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogSmF2YSBzZXJ2ZXIgcGx1Z2luIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyIjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1BsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFByZXZpZXdQbHVnaW4uCi0JICovCi0JcHVibGljIFByZXZpZXdQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJldmlld1BsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYWRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUHJvZ3Jlc3MgTW9uaXRvciB1dGlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NVdGlsIHsKLQkvKioKLQkgKiBQcm9ncmVzc1V0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFByb2dyZXNzVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2YWxpZCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldE1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGludAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGEgbnVtYmVyIG9mIHRpY2tzCi0JICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNzA4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCS8qKgotCSAqIFdhcm5pbmcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQkvKioKLQkgKiBTZXZlcmUgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCS8qKgotCSAqIEZpbmVzdCB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUFVCTElTSElORyA9IDQ7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKiBAcGFyYW0gdCBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlQcmV2aWV3UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCi0JCWlmICghUHJldmlld1BsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oUHJldmlld1BsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhOTMyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0vKioKLSAqIEEgTWVtZW50byBpcyBhIGNsYXNzIGluZGVwZW5kZW50IGNvbnRhaW5lciBmb3IgcGVyc2lzdGVuY2UKLSAqIGluZm8uICBJdCBpcyBhIHJlZmxlY3Rpb24gb2YgMyBzdG9yYWdlIHJlcXVpcmVtZW50cy4KLSAqCi0gKiAxKSAgIFdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gcGVyc2lzdCBhbiBvYmplY3QgYW5kIHJlc3RvcmUgaXQuICAKLSAqIDIpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGJlIGFic2VudC4gIElmIHNvIHdlIHdvdWxkIAotICogICAgICBsaWtlIHRvIHNraXAgdGhlIG9iamVjdCBhbmQga2VlcCByZWFkaW5nLiAKLSAqIDMpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGNoYW5nZS4gIElmIHNvIHRoZSBuZXcgY2xhc3MgCi0gKiAgICAgIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBwZXJzaXN0ZW5jZSBpbmZvLgotICoKLSAqIFdlIGNvdWxkIGFzayB0aGUgb2JqZWN0cyB0byBzZXJpYWxpemUgdGhlbXNlbHZlcyBpbnRvIGFuIAotICogT2JqZWN0T3V0cHV0U3RyZWFtLCBEYXRhT3V0cHV0U3RyZWFtLCBvciBIYXNodGFibGUuICBIb3dldmVyIAotICogYWxsIG9mIHRoZXNlIGFwcHJvYWNoZXMgZmFpbCB0byBtZWV0IHRoZSBzZWNvbmQgcmVxdWlyZW1lbnQuCi0gKgotICogTWVtZW50byBzdXBwb3J0cyBiaW5hcnkgcGVyc2lzdGFuY2Ugd2l0aCBhIHZlcnNpb24gSUQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCXByaXZhdGUgRG9jdW1lbnQgZmFjdG9yeTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEFuc3dlciBhIG1lbWVudG8gZm9yIHRoZSBkb2N1bWVudCBhbmQgZWxlbWVudC4gIEZvciBzaW1wbGljaXR5Ci0JICogeW91IHNob3VsZCB1c2UgY3JlYXRlUmVhZFJvb3QgYW5kIGNyZWF0ZVdyaXRlUm9vdCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLQkgKiBtZW1lbnRvcyBvbiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgWE1MTWVtZW50byhEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWwpIHsKLQkJZmFjdG9yeSA9IGRvYzsKLQkJZWxlbWVudCA9IGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jY3JlYXRlQ2hpbGQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSkgewotCQlFbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgYSB0eXBlCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50OwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICogCi0JICogQHBhcmFtIG9zIGFuIG91dHB1dCBzdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSAobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZW1lbnRvIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSB3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXcgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlzYXZlKHcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QaW5nVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2Q4MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiBUaHJlYWQgdXNlZCB0byBwaW5nIHNlcnZlciB0byB0ZXN0IHdoZW4gaXQgaXMgc3RhcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIFBpbmdUaHJlYWQgewotCS8vIGRlbGF5IGJlZm9yZSBwaW5naW5nIHN0YXJ0cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMjAwMDsKLQotCS8vIGRlbGF5IGJldHdlZW4gcGluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDI1MDsKLQotCS8vIG1heGltdW0gbnVtYmVyIG9mIHBpbmdzIGJlZm9yZSBnaXZpbmcgdXAKLQlwcml2YXRlIGludCBtYXhQaW5nczsKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGJlaGF2aW91cgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMuYmVoYXZpb3VyID0gYmVoYXZpb3VyOwotCQl0aGlzLm1heFBpbmdzID0gZ3Vlc3NNYXhQaW5ncygpOwotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlByZXZpZXcgUGluZyBUaHJlYWQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGluZygpOwotCQkJfQotCQl9OwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdC5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgaW50IGd1ZXNzTWF4UGluZ3MoKSB7Ci0JCWludCBzdGFydFRpbWVvdXQgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKLQkJaWYgKHN0YXJ0VGltZW91dCA+IDApCi0JCQlyZXR1cm4gc3RhcnRUaW1lb3V0IC8gUElOR19JTlRFUlZBTDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFBpbmcgdGhlIHNlcnZlciB1bnRpbCBpdCBpcyBzdGFydGVkLiBUaGVuIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvCi0JICogU1RBVEVfU1RBUlRFRC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwaW5nKCkgewotCQlpbnQgY291bnQgPSAwOwotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKFBJTkdfREVMQVkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJd2hpbGUgKCFzdG9wKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb3VudCA9PSBtYXhQaW5ncykgewotCQkJCQl0cnkgewotCQkJCQkJc2VydmVyLnN0b3AoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogY291bGQgbm90IHN0b3Agc2VydmVyIik7Ci0JCQkJCX0KLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljb3VudCsrOwotCQkJCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHBpbmdpbmcgIiArIGNvdW50KTsKLQkJCQlVUkwgcGluZ1VybCA9IG5ldyBVUkwodXJsKTsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm4gPSBwaW5nVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJKChIdHRwVVJMQ29ubmVjdGlvbiljb25uKS5nZXRSZXNwb25zZUNvZGUoKTsKLQkKLQkJCQkvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAotCQkJCWlmICghc3RvcCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBzdWNjZXNzIik7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCX0KLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBmYWlsZWQiKTsKLQkJCQkvLyBwaW5naW5nIGZhaWxlZAotCQkJCWlmICghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBwaW5naW5nIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3RvcHBpbmciKTsKLQkJc3RvcCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWMzOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuUHJldmlld1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfQlVORExFX0lEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIsCi0JCSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiLAotCQkiamF2YXguc2VydmxldCIsCi0JCSJqYXZheC5zZXJ2bGV0LmpzcCIsCi0JCSJvcmcuYXBhY2hlLmphc3BlciIsCi0JCSJvcmcubW9ydGJheS5qZXR0eSIsCi0JCSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0NMQVNTID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3U3RhcnRlciI7Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMYXVuY2ggY29uZmlndXJhdGlvbiBjb3VsZCBub3QgZmluZCBzZXJ2ZXIiKTsKLQkJCS8vIHRocm93IENvcmVFeGNlcHRpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHNlcnZlci5zaG91bGRQdWJsaXNoKCkgJiYgU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkpCi0JCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotCQkKLQkJUHJldmlld1NlcnZlckJlaGF2aW91ciBwcmV2aWV3U2VydmVyID0gKFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlci5sb2FkQWRhcHRlcihQcmV2aWV3U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJCi0JCWludCBzaXplID0gUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGphcnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCWlmIChiICE9IG51bGwpCi0JCQkJcGF0aCA9IFByZXZpZXdSdW50aW1lLmdldEphcnJlZFBsdWdpblBhdGgoYik7Ci0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgZmluZCByZXF1aXJlZCBidW5kbGUgIiArIFJFUVVJUkVEX0JVTkRMRV9JRFNbaV0pKTsKLQkJCWphcnNbaV0gPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCQkKLQkJaWYgKG5ldyBGaWxlKGphcnNbNl0gKyAiYmluIikuZXhpc3RzKCkpCi0JCQlqYXJzWzZdID0gamFyc1s2XSArICJiaW4iOwotCQkKLQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJCi0JCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJaWYgKHJ1bm5lciA9PSBudWxsKQotCQkJcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkKLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJOYW1lID0gd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCi0JCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCVN0cmluZyBwZ21BcmdzID0gIlwiIiArIHByZXZpZXdTZXJ2ZXIuZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZCgicHJldmlldy54bWwiKS50b09TU3RyaW5nKCkgKyAiXCIiOyAKLQkJCS8vZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0JCQotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0JCQotCQkvLyBWTS1zcGVjaWZpYyBhdHRyaWJ1dGVzCi0JCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIENsYXNzcGF0aAotCQlTdHJpbmdbXSBjbGFzc3BhdGgyID0gZ2V0Q2xhc3NwYXRoKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBuZXcgU3RyaW5nW2NsYXNzcGF0aDIubGVuZ3RoICsgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGphcnMsIDAsIGNsYXNzcGF0aCwgMCwgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aDIsIDAsIGNsYXNzcGF0aCwgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGgsIGNsYXNzcGF0aDIubGVuZ3RoKTsKLQkJCi0JCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZyA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oTUFJTl9DTEFTUywgY2xhc3NwYXRoKTsKLQkJcnVuQ29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQlydW5Db25maWcuc2V0RW52aXJvbm1lbnQoZW52cCk7Ci0JCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCQkKLQkJLy8gQm9vdHBhdGgKLQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJaWYgKGJvb3RwYXRoICE9IG51bGwgJiYgYm9vdHBhdGgubGVuZ3RoID4gMCkKLQkJCXJ1bkNvbmZpZy5zZXRCb290Q2xhc3NQYXRoKGJvb3RwYXRoKTsKLQkJCi0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBMYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJcHJldmlld1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQlTZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmNvbmZpZ3VyZVByb2ZpbGluZyhsYXVuY2gsIHZtLCBydW5Db25maWcsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCXJ1bm5lci5ydW4ocnVuQ29uZmlnLCBsYXVuY2gsIG1vbml0b3IpOwotCQkJcHJldmlld1NlcnZlci5hZGRQcm9jZXNzTGlzdGVuZXIobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSAtIHByb2Nlc3MgZmFpbGVkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc0ZDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZUFydGlmYWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBtb2R1bGVBcnRpZmFjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlQcmV2aWV3U2VydmVyIHNlcnZlcjIgPSAoUHJldmlld1NlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFByZXZpZXdTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQlpZiAoc2VydmVyMiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9IHNlcnZlcjIuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7Ci0JCQkJV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZUFydGlmYWN0OwotCQkJCVN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCi0JCQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKSArICIvIiArIHBhdGgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBIdHRwTGF1bmNoYWJsZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gbGF1bmNoYWJsZSBhZGFwdGVyIiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjM2JmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlByZXZpZXdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBKMkVFIHByZXZpZXcgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSUphdmFSdW50aW1lV29ya2luZ0NvcHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByZXZpZXcgcnVudGltZS4KLQkgKi8KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBidW5kbGUuCi0JICogCi0JICogQHJldHVybiBhIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFBhdGggZ2V0UGx1Z2luUGF0aChCdW5kbGUgYnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGdldEphcnJlZFBsdWdpblBhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCByZXR1cm4gbnVsbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKGdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlTdHJpbmcgaWQgPSBnZXRWTUluc3RhbGxJZCgpOwotCQkJZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpIHsKLQkJCQlpZiAoaWQuZXF1YWxzKHZtSW5zdGFsbC5nZXRJZCgpKSkKLQkJCQkJcmV0dXJuIHZtSW5zdGFsbDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkKLQkJaWYgKGdldFZNSW5zdGFsbCgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0JCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOwotCQl9IGVsc2UKLQkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWEyMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVFVSVJFRF9CVU5ETEVfSURTID0gbmV3IFN0cmluZ1tdIHsKLQkJImphdmF4LnNlcnZsZXQiLAotCQkiamF2YXguc2VydmxldC5qc3AiCi0JfTsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0LCBJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCUxpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IFJFUVVJUkVEX0JVTkRMRV9JRFMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gUHJldmlld1J1bnRpbWUuZ2V0SmFycmVkUGx1Z2luUGF0aChiKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTY5Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5QcmV2aWV3UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLklTdGF0aWNXZWI7Ci0vKioKLSAqIEoyRUUgcHJldmlldyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyIGV4dGVuZHMgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVVJMUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5zZXJ2ZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUE9SVCA9ICJwb3J0IjsKLQotCS8qKgotCSAqIFByZXZpZXdTZXJ2ZXIuCi0JICovCi0JcHVibGljIFByZXZpZXdTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBQcmV2aWV3UnVudGltZSBnZXRQcmV2aWV3UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gKFByZXZpZXdSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoUHJldmlld1J1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBVUkwgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYmFzZSA9ICJodHRwOi8vbG9jYWxob3N0IjsKLQkJCQotCQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCWlmIChwb3J0ID09IDgwKQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICIvIik7Ci0JCQllbHNlCi0JCQkJdXJsID0gbmV3IFVSTChiYXNlICsgIjoiICsgcG9ydCArICIvIik7Ci0JCQkKLQkJCVN0cmluZyB0eXBlID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKCJ3c3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodXJsLCBzdGF0aWNXZWIuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQl9IGVsc2UgaWYgKCJqc3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodXJsLCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdXJsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCByb290IFVSTCIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIHJvb3QgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyLCBhbmQgZmFsc2UKLQkgKiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGFkZCBtb2R1bGVzCi0JICogQHBhcmFtIHJlbW92ZSBtb2R1bGVzCi0JICogQHJldHVybiB0aGUgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFByZXZpZXdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5jYW5Nb2RpZnlNb2R1bGVzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlpbnQgcG9ydCA9IGdldFBvcnQoKTsKLQkJU2VydmVyUG9ydFtdIHBvcnRzID0geyBuZXcgU2VydmVyUG9ydCgiaHR0cCIsIE1lc3NhZ2VzLmh0dHBQb3J0LCBwb3J0LCAiaHR0cCIpIH07Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUHJldmlld1NlcnZlci5QUk9QRVJUWV9QT1JULCA4MDgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXNldEF0dHJpYnV0ZShQcmV2aWV3U2VydmVyLlBST1BFUlRZX1BPUlQsIHBvcnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBjcmVhdGVQcmV2aWV3U2VydmVyKFN0cmluZyBzZXJ2ZXJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUoUHJldmlld1J1bnRpbWUuSUQpOwotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lQ29weSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoUHJldmlld1J1bnRpbWUuSUQsIG1vbml0b3IpOwotCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVDb3B5LnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JCQkKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKElEKTsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKElELCBudWxsLCBydW50aW1lLCBtb25pdG9yKTsKLQkJCXdvcmtpbmdDb3B5LnNldE5hbWUoc2VydmVyTmFtZSk7Ci0JCQl3b3JraW5nQ29weS5zZXRIb3N0KCJsb2NhbGhvc3QiKTsKLQkJCXJldHVybiB3b3JraW5nQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBmaW5kUHJldmlld1NlcnZlcihTdHJpbmcgaWQpIHsKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJZm9yIChJU2VydmVyIHNlcnZlciA6IHNlcnZlcnMpIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJldmlld1NlcnZlciI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDc5MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuUHJldmlld1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5Qcm9ncmVzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0vKioKLSAqIEdlbmVyaWMgSHR0cCBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgewotCS8vIHRoZSB0aHJlYWQgdXNlZCB0byBwaW5nIHRoZSBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFBpbmdUaHJlYWQgcGluZyA9IG51bGw7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBJRGVidWdFdmVudFNldExpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZpZXdTZXJ2ZXIuCi0JICovCi0JcHVibGljIFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBQcmV2aWV3UnVudGltZSBnZXRQcmV2aWV3UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChQcmV2aWV3UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFByZXZpZXdSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1NlcnZlciBnZXRQcmV2aWV3U2VydmVyKCkgewotCQlyZXR1cm4gKFByZXZpZXdTZXJ2ZXIpIGdldFNlcnZlcigpLmdldEFkYXB0ZXIoUHJldmlld1NlcnZlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBiYXNlIHBhdGggZm9yIHJlbGF0aXZlIHBhdGhzIGluIHRoZSBzZXJ2ZXIKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIGZvciBzdGFydGluZyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2ggSUxhdW5jaAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGNoZWNrIHRoYXQgcG9ydHMgYXJlIGZyZWUKLQkJU2VydmVyUG9ydFtdIHBvcnRzID0gZ2V0UHJldmlld1NlcnZlcigpLmdldFNlcnZlclBvcnRzKCk7Ci0JCWludCBwb3J0ID0gcG9ydHNbMF0uZ2V0UG9ydCgpOwotCQkKLQkJaWYgKFNvY2tldFV0aWwuaXNQb3J0SW5Vc2UocG9ydCwgNSkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByZXZpZXdQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclBvcnRJblVzZSwgbmV3IFN0cmluZ1tdIHtwb3J0ICsgIiIsIGdldFNlcnZlcigpLmdldE5hbWUoKX0pLCBudWxsKSk7Ci0JCQotCQkvLyBnZW5lcmF0ZSBwcmV2aWV3IGNvbmZpZyBmaWxlCi0JCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzZXJ2ZXIiKTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKCJwb3J0IiwgcG9ydCk7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldFNlcnZlcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKLQkJCUlNZW1lbnRvIG1vZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vZHVsZSIpOwotCQkJbW9kLnB1dFN0cmluZygibmFtZSIsIG1vZHVsZS5nZXROYW1lKCkpOwotCQkJU3RyaW5nIHR5cGUgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCk7Ci0JCQlpZiAoIndzdC53ZWIiLmVxdWFscyh0eXBlKSkgewotCQkJCUlTdGF0aWNXZWIgc3RhdGljV2ViID0gKElTdGF0aWNXZWIpIG1vZHVsZS5sb2FkQWRhcHRlcihJU3RhdGljV2ViLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAoc3RhdGljV2ViICE9IG51bGwpCi0JCQkJCW1vZC5wdXRTdHJpbmcoImNvbnRleHQiLCBzdGF0aWNXZWIuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQkJbW9kLnB1dFN0cmluZygidHlwZSIsICJzdGF0aWMiKTsKLQkJCX0gZWxzZSBpZiAoImpzdC53ZWIiLmVxdWFscyh0eXBlKSkgewotCQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpIG1vZHVsZS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAod2ViTW9kdWxlICE9IG51bGwpCi0JCQkJCW1vZC5wdXRTdHJpbmcoImNvbnRleHQiLCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQkJbW9kLnB1dFN0cmluZygidHlwZSIsICJqMmVlIik7Ci0JCQl9Ci0JCQltb2QucHV0U3RyaW5nKCJwYXRoIiwgZ2V0TW9kdWxlUHVibGlzaERpcmVjdG9yeShtb2R1bGUpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW1lbWVudG8uc2F2ZVRvRmlsZShnZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJwcmV2aWV3LnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCB3cml0ZSBwcmV2aWV3IGNvbmZpZyIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvdWxkIG5vdCB3cml0ZSBwcmV2aWV3IGNvbmZpZ3VyYXRpb24iLCBudWxsKSk7Ci0JCX0KLQkJCi0JCXNldFNlcnZlclJlc3RhcnRTdGF0ZShmYWxzZSk7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpOwotCQlzZXRNb2RlKGxhdW5jaE1vZGUpOwotCQkKLQkJLy8gcGluZyBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQkJdHJ5IHsKLQkJCVN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdCI7Ci0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl1cmwgKz0gIjoiICsgcG9ydDsKLQkJCXBpbmcgPSBuZXcgUGluZ1RocmVhZChnZXRTZXJ2ZXIoKSwgdXJsLCB0aGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNhbid0IHBpbmcgZm9yIFRvbWNhdCBzdGFydHVwLiIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc0xpc3RlbmVyKGZpbmFsIElQcm9jZXNzIG5ld1Byb2Nlc3MpIHsKLQkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsIHx8IG5ld1Byb2Nlc3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJRGVidWdFdmVudFNldExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQkJCWlmIChldmVudHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKERlYnVnRXZlbnQgZXZlbnQgOiBldmVudHMpIHsKLQkJCQkJCWlmIChuZXdQcm9jZXNzICE9IG51bGwgJiYgbmV3UHJvY2Vzcy5lcXVhbHMoZXZlbnQuZ2V0U291cmNlKCkpICYmIGV2ZW50LmdldEtpbmQoKSA9PSBEZWJ1Z0V2ZW50LlRFUk1JTkFURSkgewotCQkJCQkJCXN0b3AodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCXNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGVUcmVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVUcmVlW21vZHVsZVRyZWUubGVuZ3RoIC0gMV07IAotCQlJUGF0aCB0byA9IGdldE1vZHVsZVB1Ymxpc2hEaXJlY3RvcnkobW9kdWxlKTsKLQkJCi0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiB8fCBkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkgewotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeSh0by50b0ZpbGUoKSwgbW9uaXRvcik7Ci0JCQl0aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBnZXRSZXNvdXJjZXMobW9kdWxlVHJlZSk7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzLCB0bywgbW9uaXRvcik7Ci0JCXRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlVHJlZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRocm93IGEgQ29yZUV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9mCi0JICogZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBMaXN0IGNvbnRhaW5pbmcgZXJyb3IgYW5kIHdhcm5pbmcgSVN0YXR1cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHN0YXR1cy5sZW5ndGggPT0gMSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yUHVibGlzaDsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgc3RhdHVzLCBtZXNzYWdlLCBudWxsKTsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCS8qKgotCSAqIENsZWFubHkgc2h1dHMgZG93biBhbmQgdGVybWluYXRlcyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpIHsKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOwotCQkKLQkJaWYgKHBpbmcgIT0gbnVsbCkgewotCQkJcGluZy5zdG9wKCk7Ci0JCQlwaW5nID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiS2lsbGluZyB0aGUgcHJvY2VzcyIpOwotCQkJSUxhdW5jaCBsYXVuY2ggPSBnZXRTZXJ2ZXIoKS5nZXRMYXVuY2goKTsKLQkJCWlmIChsYXVuY2ggIT0gbnVsbCkKLQkJCQlsYXVuY2gudGVybWluYXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7Ci0JCX0KLQkJCi0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRUZW1wRGlyZWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlJ3MgcHVibGlzaCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoIGRpcmVjdG9yeSBmb3IgdGhlIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRNb2R1bGVQdWJsaXNoRGlyZWN0b3J5KElNb2R1bGUgbW9kdWxlKSB7Ci0JCXJldHVybiBnZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKG1vZHVsZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcmV2aWV3U2VydmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjE1ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRm9sZGVyU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlI2NvbXB1dGVTb3VyY2VDb250YWluZXJzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4oKTsKLQkJY2xhc3NwYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFNvdXJjZUxvb2t1cFBhdGgoY29uZmlndXJhdGlvbikpKTsKLQkJTGlzdDxJU291cmNlQ29udGFpbmVyPiBzb3VyY2Vmb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJU291cmNlQ29udGFpbmVyPigpOwotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlMaXN0PElKYXZhUHJvamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PigpOwotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCUlGb2xkZXIgbW9kdWxlRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIobW9kdWxlLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChtb2R1bGVGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCXNvdXJjZWZvbGRlckxpc3QuYWRkKG5ldyBGb2xkZXJTb3VyY2VDb250YWluZXIobW9kdWxlRm9sZGVyLCB0cnVlKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKGphdmFQcm9qZWN0KSkKLQkJCQkJCQkJbGlzdC5hZGQoamF2YVByb2plY3QpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W3NpemVdOwotCQkJbGlzdC50b0FycmF5KHByb2plY3RzKTsKLQkJCQotCQkJZm9yIChJSmF2YVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKQotCQkJCWNsYXNzcGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHByb2plY3QpKSk7Ci0JCX0KLQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aHMuc2l6ZSgpXTsKLQkJY2xhc3NwYXRocy50b0FycmF5KGVudHJpZXMpOwotCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZCA9IEphdmFSdW50aW1lLnJlc29sdmVTb3VyY2VMb29rdXBQYXRoKGVudHJpZXMsIGNvbmZpZ3VyYXRpb24pOwotCQlJU291cmNlQ29udGFpbmVyW10gc291cmNlQ29udGFpbmVycyA9IEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwotCQkKLQkJaWYgKCFzb3VyY2Vmb2xkZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbWJpbmVkU291cmNlQ29udGFpbmVycyA9IG5ldyBJU291cmNlQ29udGFpbmVyW3NvdXJjZUNvbnRhaW5lcnMubGVuZ3RoICsgc291cmNlZm9sZGVyTGlzdC5zaXplKCldOwotCQkJc291cmNlZm9sZGVyTGlzdC50b0FycmF5KGNvbWJpbmVkU291cmNlQ29udGFpbmVycyk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZUNvbnRhaW5lcnMsIDAsIGNvbWJpbmVkU291cmNlQ29udGFpbmVycywgc291cmNlZm9sZGVyTGlzdC5zaXplKCksIHNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoKTsKLQkJCXNvdXJjZUNvbnRhaW5lcnMgPSBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnM7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlQ29udGFpbmVyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdmNTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ4eXoiOyAKLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGNyZWF0ZSBydW50aW1lCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkKLQkJZm9yIChJUnVudGltZSByIDogcnVudGltZXMpIHsKLQkJCWlmIChyLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBQcmV2aWV3UnVudGltZS5JRC5lcXVhbHMoci5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJaWYgKElELmVxdWFscyhyLmdldElkKCkpKQotCQkJCQlydW50aW1lID0gcjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShQcmV2aWV3UnVudGltZS5JRCk7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoSUQsIG51bGwpOwotCQkJCXdjLnNldE5hbWUoIk15IFByZXZpZXciKTsKLQkJCQl3Yy5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQlydW50aW1lID0gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBkZWZhdWx0IHByZXZpZXcgcnVudGltZSIpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBjcmVhdGUgc2VydmVyCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSVNlcnZlciBzIDogc2VydmVycykgewotCQkJaWYgKHMuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgUHJldmlld1NlcnZlci5JRC5lcXVhbHMocy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQlpZiAoSUQuZXF1YWxzKHMuZ2V0SWQoKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFmb3VuZCkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShQcmV2aWV3U2VydmVyLklEKTsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbnVsbCk7Ci0JCQkJd2Muc2V0TmFtZSgiTXkgcHJldmlldyIpOwotCQkJCXdjLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCQkJCXdjLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCXdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgZGVmYXVsdCBwcmV2aWV3IHNlcnZlciIpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL3VpL1ByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL3VpL1ByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzNzMwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotLyoqCi0gKiBBIGRlYnVnIHRhYiBncm91cCBmb3IgbGF1bmNoaW5nIFRvbWNhdC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgewotCS8qCi0JICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwI2NyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2csIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiWzZdOwotCQl0YWJzWzBdID0gbmV3IFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIobmV3IFN0cmluZ1tdIHsgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldyIgfSk7Ci0JCXRhYnNbMF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzFdID0gbmV3IEphdmFBcmd1bWVudHNUYWIoKTsKLQkJdGFic1sxXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMl0gPSBuZXcgSmF2YUNsYXNzcGF0aFRhYigpOwotCQl0YWJzWzJdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1szXSA9IG5ldyBTb3VyY2VMb29rdXBUYWIoKTsKLQkJdGFic1szXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNF0gPSBuZXcgRW52aXJvbm1lbnRUYWIoKTsKLQkJdGFic1s0XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNV0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjZjQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlXzMuMC4wLmphcgotc2phdmFjb3JlLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWYwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcHVibGlzaGluZz1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzNhODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE2OWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE2OjU5OjE1IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0YmRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jRnJpIE5vdiAxMCAxODowNjoxMSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjQxMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRvbWNhdGNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdlNmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZV8zLjAuMC5qYXIKLXRvbWNhdGNvcmUuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVhZTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmJlNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjNDAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotI1dlZCBKYW4gMTcgMTQ6MTI6MDIgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGJkZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNGcmkgTm92IDEwIDE4OjA2OjExIEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNiNTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmY4ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHZlcmlmeUluc3RhbGwucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAubG9hZGVyLmphcixcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1LmxvYWRlci5qYXIsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MC5sb2FkZXIuamFyCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSB0b21jYXRjb3JlLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAubG9hZGVyLmphciBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwLmxvYWRlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGE0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAubG9hZGVyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1LmxvYWRlci5qYXIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NS5sb2FkZXIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2YwMzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1LmxvYWRlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MC5sb2FkZXIuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAubG9hZGVyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMTllMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MC5sb2FkZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTYwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9QXBhY2hlIFRvbWNhdCBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAtLS0tLS0tLS0tLS0tLS0gUnVudGltZSBUeXBlcyAtLS0tLS0tLS0tLS0tLS0KLWFwYWNoZT1BcGFjaGUKLXJ1bnRpbWVUeXBlVG9tY2F0MzJMYWJlbD1BcGFjaGUgVG9tY2F0IHYzLjIKLXJ1bnRpbWVUeXBlVG9tY2F0MzJEZXNjcmlwdGlvbj1BcGFjaGUgVG9tY2F0IHYzLjIgc3VwcG9ydHMgSjJFRSAxLjIgV2ViIG1vZHVsZXMuCi1ydW50aW1lVHlwZVRvbWNhdDQwTGFiZWw9QXBhY2hlIFRvbWNhdCB2NC4wCi1ydW50aW1lVHlwZVRvbWNhdDQwRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2NC4wIHN1cHBvcnRzIEoyRUUgMS4yIGFuZCAxLjMgV2ViIG1vZHVsZXMuCi1ydW50aW1lVHlwZVRvbWNhdDQxTGFiZWw9QXBhY2hlIFRvbWNhdCB2NC4xCi1ydW50aW1lVHlwZVRvbWNhdDQxRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2NC4xIHN1cHBvcnRzIEoyRUUgMS4yIGFuZCAxLjMgV2ViIG1vZHVsZXMuCi1ydW50aW1lVHlwZVRvbWNhdDUwTGFiZWw9QXBhY2hlIFRvbWNhdCB2NS4wCi1ydW50aW1lVHlwZVRvbWNhdDUwRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2NS4wIHN1cHBvcnRzIEoyRUUgMS4yLCAxLjMsIGFuZCAxLjQgV2ViIG1vZHVsZXMuCi1ydW50aW1lVHlwZVRvbWNhdDU1TGFiZWw9QXBhY2hlIFRvbWNhdCB2NS41Ci1ydW50aW1lVHlwZVRvbWNhdDU1RGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2NS41IHN1cHBvcnRzIEoyRUUgMS4yLCAxLjMsIGFuZCAxLjQgV2ViIG1vZHVsZXMuCi1ydW50aW1lVHlwZVRvbWNhdDYwTGFiZWw9QXBhY2hlIFRvbWNhdCB2Ni4wCi1ydW50aW1lVHlwZVRvbWNhdDYwRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2Ni4wIHN1cHBvcnRzIEoyRUUgMS4yLCAxLjMsIDEuNCwgYW5kIEphdmEgRUUgNSBXZWIgbW9kdWxlcy4KLQotIyAtLS0tLS0tLS0tLS0tLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0KLXRvbWNhdDMyU2VydmVyVHlwZT1Ub21jYXQgdjMuMiBTZXJ2ZXIKLXRvbWNhdDMyU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXQ0MFNlcnZlclR5cGU9VG9tY2F0IHY0LjAgU2VydmVyCi10b21jYXQ0MFNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0NDFTZXJ2ZXJUeXBlPVRvbWNhdCB2NC4xIFNlcnZlcgotdG9tY2F0NDFTZXJ2ZXJEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSBXZWIgcHJvamVjdHMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyB0byBhIGxvY2FsIFRvbWNhdCBzZXJ2ZXIuCi0KLXRvbWNhdDUwU2VydmVyVHlwZT1Ub21jYXQgdjUuMCBTZXJ2ZXIKLXRvbWNhdDUwU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXQ1NVNlcnZlclR5cGU9VG9tY2F0IHY1LjUgU2VydmVyCi10b21jYXQ1NVNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0NjBTZXJ2ZXJUeXBlPVRvbWNhdCB2Ni4wIFNlcnZlcgotdG9tY2F0NjBTZXJ2ZXJEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSBhbmQgSmF2YSBFRSBXZWIgcHJvamVjdHMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyB0byBhIGxvY2FsIFRvbWNhdCBzZXJ2ZXIuCi0KLXRvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25UeXBlPUFwYWNoZSBUb21jYXQKLQotIyAtLS0tLS0tLS0tLS0tLS0gR2VuZXJhbCAtLS0tLS0tLS0tLS0tLS0KLWNhbkFkZE1vZHVsZT1XZWIgbW9kdWxlIGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmVyLgotY2FuTW9kaWZ5TW9kdWxlcz1XZWIgbW9kdWxlcyBjYW4gYmUgbW9kaWZpZWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY0YjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjMyIgotICAgICAgIG5hbWU9IiVydW50aW1lVHlwZVRvbWNhdDMyTGFiZWwiCi0gICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZVRvbWNhdDMyRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlYXBhY2hlIgotICAgICAgIHZlcnNpb249IjMuMiIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yIi8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotCi0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0NDBMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0NDBEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iNC4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMyIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLQotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgIG5hbWU9IiVydW50aW1lVHlwZVRvbWNhdDQxTGFiZWwiCi0gICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZVRvbWNhdDQxRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlYXBhY2hlIgotICAgICAgIHZlcnNpb249IjQuMSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQ1MExhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQ1MERlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSI1LjAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQ1NUxhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQ1NURlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSI1LjUiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MCIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQ2MExhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQ2MERlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSI2LjAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQsIDIuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVMb2NhdG9ycyI+Ci0gICAgPHJ1bnRpbWVMb2NhdG9yCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUubG9jYXRvciIKLSAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLioiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZUxvY2F0b3IiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4qIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgIG5hbWU9IiV0b21jYXQzMlNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQzMlNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSIzMDAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICBuYW1lPSIldG9tY2F0NDBTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0NDBTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iMzAwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgbmFtZT0iJXRvbWNhdDQxU2VydmVyVHlwZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXRvbWNhdDQxU2VydmVyRGVzY3JpcHRpb24iCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBzdGFydFRpbWVvdXQ9IjMwMDAwIgotICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0idHJ1ZSIKLSAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlciIKLSAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgIG5hbWU9IiV0b21jYXQ1MFNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQ1MFNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSI0NTAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIKLSAgICAgICBuYW1lPSIldG9tY2F0NTVTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0NTVTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iNDUwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAiCi0gICAgICAgbmFtZT0iJXRvbWNhdDYwU2VydmVyVHlwZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXRvbWNhdDYwU2VydmVyRGVzY3JpcHRpb24iCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBzdGFydFRpbWVvdXQ9IjQ1MDAwIgotICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0idHJ1ZSIKLSAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlciIKLSAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJMb2NhdG9ycyI+Ci0gICAgPHNlcnZlckxvY2F0b3IKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuc2VydmVyLmxvY2F0b3IiCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJMb2NhdG9yIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5sYXVuY2hhYmxlQWRhcHRlcnMiPgotICAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LndlYiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotICAgICA8c291cmNlUGF0aENvbXB1dGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZXMiPgotICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiV0b21jYXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotICAgICAgICBtb2Rlcz0icnVuLCBkZWJ1ZywgcHJvZmlsZSIKLSAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnB1Ymxpc2hUYXNrcyI+Ci0gICAgIDxwdWJsaXNoVGFzawotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5wdWJsaXNoVGFzayIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuUHVibGlzaFRhc2siLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Ii8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgIHZlcnNpb249IjMuMiIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNC4xIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgIHZlcnNpb249IjUuMCIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSI1LjUiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNi4wIi8+Ci0KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Ii8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNC4xIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICAgIHZlcnNpb249IjUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSI2LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjMuMiIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0gICAgPHJ1bnRpbWVGYWNldE1hcHBpbmcKLSAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICB2ZXJzaW9uPSI0LjEiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjUuMCIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0gICAgPHJ1bnRpbWVGYWNldE1hcHBpbmcKLSAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICB2ZXJzaW9uPSI2LjAiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmluc3RhbGxhYmxlUnVudGltZXMiPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTEuMSIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTMvYXJjaGl2ZS92My4yLjQvYmluL2pha2FydGEtdG9tY2F0LTMuMi40LnppcCIKLSAgICAgIGFyY2hpdmVQYXRoPSJqYWthcnRhLXRvbWNhdC0zLjIuNCIKLSAgICAgIG9zPSJ3aW4zMiIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTEuMSIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTMvYXJjaGl2ZS92My4yLjQvYmluL2pha2FydGEtdG9tY2F0LTMuMi40LnRhci5neiIKLSAgICAgIGFyY2hpdmVQYXRoPSJqYWthcnRhLXRvbWNhdC0zLjIuNCIKLSAgICAgIG9zPSJsaW51eCIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTEuMSIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTQvYXJjaGl2ZS92NC4wLjYvYmluL2pha2FydGEtdG9tY2F0LTQuMC42LnppcCIKLSAgICAgIGFyY2hpdmVQYXRoPSJqYWthcnRhLXRvbWNhdC00LjAuNiIKLSAgICAgIG9zPSJ3aW4zMiIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTEuMSIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTQvYXJjaGl2ZS92NC4wLjYvYmluL2pha2FydGEtdG9tY2F0LTQuMC42LnRhci5neiIKLSAgICAgIGFyY2hpdmVQYXRoPSJqYWthcnRhLXRvbWNhdC00LjAuNiIKLSAgICAgIG9zPSJsaW51eCIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC00L3Y0LjEuMzYvYmluL2FwYWNoZS10b21jYXQtNC4xLjM2LnppcCIKLSAgICAgIGFyY2hpdmVQYXRoPSJhcGFjaGUtdG9tY2F0LTQuMS4zNiIKLSAgICAgIG9zPSJ3aW4zMiIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC00L3Y0LjEuMzYvYmluL2FwYWNoZS10b21jYXQtNC4xLjM2LnRhci5neiIKLSAgICAgIGFyY2hpdmVQYXRoPSJhcGFjaGUtdG9tY2F0LTQuMS4zNiIKLSAgICAgIG9zPSJsaW51eCIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC01L3Y1LjAuMjgvYmluL2pha2FydGEtdG9tY2F0LTUuMC4yOC56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtNS4wLjI4IgotICAgICAgb3M9IndpbjMyIi8+Ci0gICAgPHJ1bnRpbWUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIgotICAgICAgbGljZW5zZVVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTUvdjUuMC4yOC9iaW4vamFrYXJ0YS10b21jYXQtNS4wLjI4LnRhci5neiIKLSAgICAgIGFyY2hpdmVQYXRoPSJqYWthcnRhLXRvbWNhdC01LjAuMjgiCi0gICAgICBvcz0ibGludXgiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNS92NS41LjI1L2Jpbi9hcGFjaGUtdG9tY2F0LTUuNS4yNS56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC01LjUuMjUiCi0gICAgICBvcz0id2luMzIiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNS92NS41LjI1L2Jpbi9hcGFjaGUtdG9tY2F0LTUuNS4yNS50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC01LjUuMjUiCi0gICAgICBvcz0ibGludXgiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNi92Ni4wLjE0L2Jpbi9hcGFjaGUtdG9tY2F0LTYuMC4xNC56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC02LjAuMTQiCi0gICAgICBvcz0id2luMzIiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNi92Ni4wLjE0L2Jpbi9hcGFjaGUtdG9tY2F0LTYuMC4xNC50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC02LjAuMTQiCi0gICAgICBvcz0ibGludXgiLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ2F0YWxpbmFQcm9wZXJ0aWVzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9DYXRhbGluYVByb3BlcnRpZXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzY3NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9DYXRhbGluYVByb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElnb3IgRmVkb3JlbmtvICYgRmFicml6aW8gR2l1c3RpbmEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGhhbmRsaW5nIGxvYWRlcnMgaW4gY2F0YWxpbmEucHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIENhdGFsaW5hUHJvcGVydGllc1V0aWwgewotCi0gICAgLyoqCi0gICAgICogRG9uJ3QgaW5zdGFudGlhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIENhdGFsaW5hUHJvcGVydGllc1V0aWwoKSB7Ci0gICAgICAgIC8vIHVudXNlZAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaXN0IG9mIHBhdGggZWxlbWVudHMgdG8gYSBzcGVjaWZpYyBsb2FkZXIgaW4gY2F0YWxpbmEucHJvcGVydGllcy4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHVzZSBqYXZhLnV0aWwuUHJvcGVydGllcyBpbiBvcmRlciB0byBrZWVwIGZpbGUKLSAgICAgKiBmb3JtYXR0aW5nIGludGFjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZSBjYXRhbGluYS5wcm9wZXJ0aWVzIGZpbGUKLSAgICAgKiBAcGFyYW0gbG9hZGVyIGxvYWRlciBuYW1lCi0gICAgICogQHBhcmFtIGVsZW1lbnRzIExpc3Qgb2YgY2xhc3NwYXRoIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRHbG9iYWxDbGFzc3BhdGgoRmlsZSBmaWxlLCBTdHJpbmcgbG9hZGVyLAotICAgICAgICAgICAgU3RyaW5nW10gZWxlbWVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxvYWRlciArICIubG9hZGVyIjsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGFkZEVsZW1lbnRzKGxpbmUsIGVsZW1lbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhZGRlZCkgewotICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIGFuIG9yaWdpbmFsIGNhdGFsaW5hLnByb3BlcnRpZXMsCi0gICAgICAgICAgICAvLyBidXQgYmV0dGVyIGhhbmRsZSBhbHNvIGZpbGVzIG1vZGlmaWVkIGJ5IHVzZXJzCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI9Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChlbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5RmlsZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCi0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGUpKTsKLSAgICAgICAgICAgIGJ3LndyaXRlKHByb3BlcnR5RmlsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ3LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBsaXN0IG9mIHBhdGggdG8gdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBsaW5lIGFuZCByZXR1cm5zIHRoZQotICAgICAqIG1vZGlmaWVkIG5hbWUuCi0gICAgICogQHBhcmFtIGxpbmUgbGluZSAocHJvcGVydHk9dmFsdWUpCi0gICAgICogQHBhcmFtIGVsZW1lbnRzIGNsYXNzcGF0aCBlbGVtZW50cyB0byBhZGQuCi0gICAgICogQHJldHVybiBtb2RpZmllZCBsaW5lCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEVsZW1lbnRzKFN0cmluZyBsaW5lLCBTdHJpbmdbXSBlbGVtZW50cykgewotICAgICAgICBTdHJpbmdbXSBwcm9wQW5kVmFsdWUgPSBsaW5lLnNwbGl0KCI9Iik7Ci0gICAgICAgIFN0cmluZyBsb2FkZXJQcm9wZXJ0eSA9ICIiOwotCi0gICAgICAgIGlmIChwcm9wQW5kVmFsdWUubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgbG9hZGVyUHJvcGVydHkgPSBwcm9wQW5kVmFsdWVbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgY2xhc3NwYXRoID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxvYWRlclByb3BlcnR5LCAiLCIpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYWRkKHN0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aC5hZGQoZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQocHJvcEFuZFZhbHVlWzBdKTsKLSAgICAgICAgc2IuYXBwZW5kKCI9Iik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjbGFzc3BhdGguaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgc2IuYXBwZW5kKGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NsYXNzRGV0ZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ2xhc3NEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY4NzM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ2xhc3NEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgY2xhc3MgZ2l2ZW4gYXMgYW4KLSAqIGFyZ3VtZW50LiAKLSAqLwotcHVibGljIGNsYXNzIENsYXNzRGV0ZWN0b3IgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCAhPSAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBDbGFzc0RldGVjdG9yIFtjbGFzc05hbWVdIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlDbGFzcy5mb3JOYW1lKGFyZ3NbMF0pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cnVlIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhbHNlIik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9GaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMwMWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hIZWxwZXI7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBmaWxlIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0JLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDEwMjQwOwotCi0JLy8gdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJdOwotCi0JLyoqCi0JICogRmlsZVV0aWwgY2Fubm90IGJlIGNyZWF0ZWQuIFVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIEZpbGVVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvcHlzIGEgZGlyZWN0b3J5IGZyb20gYSB0byBiLgotCSAqCi0JICogQHBhcmFtIGZyb20gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyZWN0b3J5KFN0cmluZyBmcm9tLCBTdHJpbmcgdG8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRmlsZSBmcm9tRGlyID0gbmV3IEZpbGUoZnJvbSk7Ci0JCQlGaWxlIHRvRGlyID0gbmV3IEZpbGUodG8pOwotCQotCQkJRmlsZVtdIGZpbGVzID0gZnJvbURpci5saXN0RmlsZXMoKTsKLQkKLQkJCXRvRGlyLm1rZGlyKCk7Ci0JCi0JCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzCi0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNvcHlpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Zyb20sIHRvfSksIHNpemUgKiA1MCk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUZpbGUgY3VycmVudCA9IGZpbGVzW2ldOwotCQkJCVN0cmluZyBmcm9tRmlsZSA9IGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIHRvRmlsZSA9IHRvOwotCQkJCWlmICghdG9GaWxlLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCQkJdG9GaWxlICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCXRvRmlsZSArPSBjdXJyZW50LmdldE5hbWUoKTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoNTApOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tRmlsZSwgdG9GaWxlfSkpOwotCQkJCQljb3B5RGlyZWN0b3J5KGZyb21GaWxlLCB0b0ZpbGUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwKSk7Ci0JCQkJfQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGRpcmVjdG9yeSIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdG8pIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCi0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0byk7Ci0JCi0JCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl3aGlsZSAoYXZhaWwgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOwotCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGUiLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIG5ldyBTdHJpbmdbXSB7dG8sIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4KLQkgKgotCSAqIEBwYXJhbSBmcm9tIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdG8gamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29weUZpbGUoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgewotCQl0cnkgewotCQkJcmV0dXJuIGNvcHlGaWxlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZnJvbSksIHRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4KLQkgKgotCSAqIEBwYXJhbSBmcm9tIGphdmEubmV0LlVSTAotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjb3B5RmlsZShVUkwgZnJvbSwgU3RyaW5nIHRvKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29weUZpbGUoZnJvbS5vcGVuU3RyZWFtKCksIHRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5cyBhIGRpcmVjdG9yeSBmcm9tIGEgdG8gYiwgb25seSBtb2RpZnlpbmcgYXMgbmVlZGVkCi0JICogYW5kIGRlbGV0aW5nIG9sZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCi0JICoKLQkgKiBAcGFyYW0gZnJvbSBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSB0byBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IHJlbGVhc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc21hcnRDb3B5RGlyZWN0b3J5KFN0cmluZyBmcm9tLCBTdHJpbmcgdG8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRmlsZSBmcm9tRGlyID0gbmV3IEZpbGUoZnJvbSk7Ci0JCQlGaWxlIHRvRGlyID0gbmV3IEZpbGUodG8pOwotCQotCQkJRmlsZVtdIGZyb21GaWxlcyA9IGZyb21EaXIubGlzdEZpbGVzKCk7Ci0JCQlpbnQgZnJvbVNpemUgPSBmcm9tRmlsZXMubGVuZ3RoOwotCQotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY29weWluZ1Rhc2ssIG5ldyBTdHJpbmdbXSB7ZnJvbSwgdG99KSwgNTUwKTsKLQkKLQkJCUZpbGVbXSB0b0ZpbGVzID0gbnVsbDsKLQkKLQkJCS8vIGRlbGV0ZSBvbGQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGZyb20gdGhpcyBkaXJlY3RvcnkKLQkJCWlmICh0b0Rpci5leGlzdHMoKSAmJiB0b0Rpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdG9GaWxlcyA9IHRvRGlyLmxpc3RGaWxlcygpOwotCQkJCWludCB0b1NpemUgPSB0b0ZpbGVzLmxlbmd0aDsKLQkKLQkJCQkvLyBjaGVjayBpZiB0aGlzIGV4YWN0IGZpbGUgZXhpc3RzIGluIHRoZSBuZXcgZGlyZWN0b3J5Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1NpemU7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IHRvRmlsZXNbaV0uZ2V0TmFtZSgpOwotCQkJCQlib29sZWFuIGlzRGlyID0gdG9GaWxlc1tpXS5pc0RpcmVjdG9yeSgpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZnJvbVNpemU7IGorKykgewotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKGZyb21GaWxlc1tqXS5nZXROYW1lKCkpICYmIGlzRGlyID09IGZyb21GaWxlc1tqXS5pc0RpcmVjdG9yeSgpKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfQotCQotCQkJCQkvLyBkZWxldGUgZmlsZSBpZiBpdCBjYW4ndCBiZSBmb3VuZCBvciBpc24ndCB0aGUgY29ycmVjdCB0eXBlCi0JCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCWlmIChpc0RpcikKLQkJCQkJCQlQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeSh0b0ZpbGVzW2ldLCBudWxsKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0b0ZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0b0Rpci5pc0ZpbGUoKSkKLQkJCQkJdG9EaXIuZGVsZXRlKCk7Ci0JCQkJdG9EaXIubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDUwKTsKLQkKLQkJCS8vIGN5Y2xlIHRocm91Z2ggZmlsZXMgYW5kIG9ubHkgY29weSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QKLQkJCS8vIG9yIGlzIG5ld2VyCi0JCQl0b0ZpbGVzID0gdG9EaXIubGlzdEZpbGVzKCk7Ci0JCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCQlpbnQgZHcgPSAwOwotCQkJaWYgKHRvU2l6ZSA+IDApCi0JCQkJZHcgPSA1MDAgLyB0b1NpemU7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21TaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmcm9tRmlsZXNbaV07Ci0JCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBvciBuZXdlciBmaWxlCi0JCQkJYm9vbGVhbiBjb3B5ID0gdHJ1ZTsKLQkJCQlpZiAoIWN1cnJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGN1cnJlbnQuZ2V0TmFtZSgpOwotCQkJCQlsb25nIG1vZCA9IGN1cnJlbnQubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdG9TaXplOyBqKyspIHsKLQkJCQkJCWlmIChuYW1lLmVxdWFscyh0b0ZpbGVzW2pdLmdldE5hbWUoKSkgJiYgbW9kIDw9IHRvRmlsZXNbal0ubGFzdE1vZGlmaWVkKCkpCi0JCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmIChjb3B5KSB7Ci0JCQkJCVN0cmluZyBmcm9tRmlsZSA9IGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCVN0cmluZyB0b0ZpbGUgPSB0bzsKLQkJCQkJaWYgKCF0b0ZpbGUuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJCQkJdG9GaWxlICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCQl0b0ZpbGUgKz0gY3VycmVudC5nZXROYW1lKCk7Ci0JCQkJCWlmIChjdXJyZW50LmlzRmlsZSgpKSB7Ci0JCQkJCQljb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKGR3KTsKLQkJCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tRmlsZSwgdG9GaWxlfSkpOwotCQkJCQkJc21hcnRDb3B5RGlyZWN0b3J5KGZyb21GaWxlLCB0b0ZpbGUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIGR3KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCg1MDAgLSBkdyAqIHRvU2l6ZSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNtYXJ0IGNvcHlpbmcgZGlyZWN0b3J5ICIgKyBmcm9tICsgIiAtICIgKyB0bywgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lNaW1lTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JTWltZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1OTQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lNaW1lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWltZU1hcHBpbmcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1pbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmFkYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtaW1lIG1hcHBpbmdzLgotCSAqIAotCSAqIEByZXR1cm4gbWltZSBtYXBwaW5ncwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgcG9ydHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJQb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgd2ViIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwZDc3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGV4dGVuZHMgSVRvbWNhdENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIEFkZCBhIHdlYiBtb2R1bGUuCi0JICoKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5XZWJNb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSk7Ci0JCi0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgd2ViIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWltZSBtYXBwaW5nLgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBtYXAgTWltZU1hcHBpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApOwotCi0JLyoqCi0JICogQ2hhbmdlIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gbWFwIE1pbWVNYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKTsKLQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGMwMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0UnVudGltZSBleHRlbmRzIElKYXZhUnVudGltZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggdGhhdCBpcyB1c2VkIGJ5IHRoaXMgcnVudGltZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNsYXNzcGF0aAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU5Mzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZVdvcmtpbmdDb3B5OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSVRvbWNhdFJ1bnRpbWUsIElKYXZhUnVudGltZVdvcmtpbmdDb3B5IHsKLQkvLyBubyBuZXcgbWV0aG9kcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTMxYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLS8qKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0U2VydmVyIGV4dGVuZHMgSVVSTFByb3ZpZGVyIHsKLQkvKioKLQkgKiBQcm9wZXJ0eSB3aGljaCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBjb25maWd1cmVkCi0JICogZm9yIHRlc3RpbmcgZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEVTVF9FTlZJUk9OTUVOVCA9ICJ0ZXN0RW52aXJvbm1lbnQiOwotCQotCS8qKgotCSAqIFByb3BlcnR5IHdoaWNoIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBleGlzdHMuICBJZiBub3Qgc3BlY2lmaWVkLCBpbnN0YW5jZSBkaXJlY3RvcnkgaXMgZGVyaXZlZAotCSAqIGZyb20gdGhlIHRleHRFbnZpcm9ubWVudCBzZXR0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lOU1RBTkNFX0RJUiA9ICJpbnN0YW5jZURpciI7Ci0JLyoqCi0JICogUHJvcGVydHkgd2hpY2ggc3BlY2lmaWVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2ViIGFwcGxpY2F0aW9ucwotCSAqIGFyZSBwdWJsaXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVQTE9ZX0RJUiA9ICJkZXBsb3lEaXIiOwotCi0JLyoqCi0JICogUHJvcGVydHkgd2hpY2ggc3BlY2lmaWVzIGlmIG1vZHVsZXMgc2hvdWxkIGJlIHNlcnZlZCB3aXRob3V0Ci0JICogcHVibGlzaGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRVJWRV9NT0RVTEVTX1dJVEhPVVRfUFVCTElTSCA9ICJzZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCI7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgd2hpY2ggc3BlY2lmaWVzIGNvbnRleHRzIGluIHRoZSBzZXJ2ZXIueG1sIGZpbGUgc2hvdWxkCi0JICogYmUgc2F2ZWQgdG8gc2VwYXJhdGUgY29udGV4dCBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TQVZFX1NFUEFSQVRFX0NPTlRFWFRfRklMRVMgPSAic2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzIjsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdGVzdCAocHVibGlzaCBhbmQgcnVuIGNvZGUgb3V0IG9mIHRoZQotCSAqIHdvcmtiZW5jaCkgZW52aXJvbm1lbnQgc2VydmVyLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZSBleGlzdHMuICBJZiBub3Qgc2V0LAotCSAqIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXN0RW52aXJvbm1lbnQgc2V0dGluZy4gIAotCSAqIAotCSAqIEByZXR1cm4gZGlyZWN0b3J5IHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgZXhpc3RzLiBSZXR1cm5zIG51bGwKLQkgKiBpZiBub3Qgc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCB3ZWIgYXBwbGljYXRpb25zIGFyZSB0byBiZSBkZXBsb3llZC4KLQkgKiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIHJ1bnRpbWUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZQotCSAqIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGRpcmVjdG9yeSB3aGVyZSB3ZWIgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95RGlyZWN0b3J5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG1vZHVsZXMgc2hvdWxkIGJlIHNlcnZlZCBkaXJlY3RseSBmcm9tIHRoZSBwcm9qZWN0Ci0JICogZm9sZGVycyB3aXRob3V0IHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgYnV0IHNlcnZlZCBkaXJlY3RseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgY29udGV4dHMgc2hvdWxkIGJlIHNhdmVkIHRvIHNlcGFyYXRlIGNvbnRleHQKLQkgKiBmaWxlcyBpbnN0ZWFkIG9mIGJlaW5nIGtlcHQgd2l0aGluIHNlcnZlci54bWwgd2hlbiB0aGUgc2VydmVyCi0JICogaXMgcHVibGlzaGVkLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb250ZXh0cyBzaG91bGQgYmUgc2F2ZWQgdG8gc2VwYXJhdGUgZmlsZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhNTczYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFNlcnZlckJlaGF2aW91ciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoIHRoZSBUb21jYXQgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gcnVudGltZSBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXR1cCBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIElMYXVuY2gKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaChJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWVmYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRTZXJ2ZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGRlcGxveW1lbnQgZGlyZWN0b3J5LiAgQXZvaWQgIndlYmFwcHMiIGR1ZSB0bwotCSAqIHNpZGUgZWZmZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFUExPWURJUiA9ICJ3dHB3ZWJhcHBzIjsKLQotCS8qKgotCSAqIFRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeSB1c2VkIGJ5IGRlZmF1bHQgaW4gcHJpb3IgdmVyc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0RFUExPWURJUiA9ICJ3ZWJhcHBzIjsKLQotCS8qKgotCSAqIFNldHMgdGhpcyBzZXJ2ZXIgdG8gdGVzdCBlbnZpcm9ubWVudCBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBiIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0RW52aXJvbm1lbnQoYm9vbGVhbiBiKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIuIElmIHNldCB0bwotCSAqIG51bGwsIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkgaXMgZGVyaXZlZCBmcm9tIHRoZQotCSAqIHRlc3RFbnZpcm9ubWVudCBzZXR0aW5nLicKLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2VEaXIgYWJzb2x1bGUgcGF0aCB0byB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbmNlRGlyZWN0b3J5KFN0cmluZyBpbnN0YW5jZURpcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlcGxveW1lbnQgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLiAgTWF5IGJlIGFic29sdXRlCi0JICogb3IgcmVsYXRpdmUgdG8gcnVudGltZSBiYXNlIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwbG95RGlyIGRlcGxveW1lbnQgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95RGlyZWN0b3J5KFN0cmluZyBkZXBsb3lEaXIpOwotCQotCS8qKgotCSAqIFNldCB0aGlzIHNlcnZlciB0byBzZXJ2ZSBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYiB0cnVlIGlmIG1vZHVsZXMgc2hvdWxkIGJlIHNlcnZlZCB3aXRob3V0IHB1Ymxpc2hpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaChib29sZWFuIGIpOwotCQotCS8qKgotCSAqIFNldCB0aGlzIHNlcnZlciB0byBzYXZlIGNvbnRleHRzIHRvIHNlcGFyYXRlIGNvbnRleHQKLQkgKiBmaWxlcyB3aGVuIHB1Ymxpc2hpbmcgdGhlIHNlcnZlci4KLQkgKiBAcGFyYW0gYiB0cnVlIGlmIGNvbnRleHRzIHNob3VsZCBiZSBzYXZlZCB0byBzZXBhcmF0ZSBmaWxlcwotCSAqIHdoZW4gcHVibGlzaGluZyB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKGJvb2xlYW4gYik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRWZXJzaW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0VmVyc2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2YzRjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRWZXJzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogVmVyaWZpZXMgaWYgdGhlIHNwZWNpZmllZCBwYXRoIHBvaW50cyB0byBhIGEgVG9tY2F0Ci0JICogaW5zdGFsbGF0aW9uIG9mIHRoaXMgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFsbFBhdGggYW4gaW5zdGFsbGF0aW9uIHBhdGggCi0JICogQHJldHVybiBPSyBzdGF0dXMgaWYgYSB2YWxpZCBpbnN0YWxsYXRpb24KLQkgKiBleGlzdHMgYXQgdGhlIGxvY2F0aW9uLiAgSWYgbm90IHZhbGlkLCB0aGUgSVN0YXR1cwotCSAqIGNvbnRhaW5zIGFuIGluZGljYXRpb24gb2Ygd2h5LgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzdGFydHVwIGNsYXNzIGZvciB0aGUgVG9tY2F0IHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHNlcnZlciBzdGFydHVwIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzdGFydHVwIGNsYXNzcGF0aCBmb3IgdGhlIFRvbWNhdCBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIGFuIGluc3RhbGxhdGlvbiBwYXRoCi0JICogQHJldHVybiBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHJlcXVpcmVkIHRvCi0JICogc3RhcnQgdGhlIFRvbWNhdCBzZXJ2ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtJ3MgcnVudGltZSBhcmd1bWVudHMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ1BhdGggYSBjb25maWcgcGF0aAotCSAqIEBwYXJhbSBkZWJ1ZyA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWJ1ZyBtb2RlIGlzIG9uCi0JICogQHBhcmFtIHN0YXJ0aW5nIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IG9mIHByb2dyYW0gYXJndW1lbnRzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpOwotCi0JLyoqCi0JICogQXJndW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIHJ1bnRpbWUgYXJndW1lbnRzIGJhc2VkIG9uCi0JICogdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZWJ1ZyA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWJ1ZyBtb2RlIGlzIG9uCi0JICogQHBhcmFtIHN0YXJ0aW5nIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGV4Y2x1ZGVkIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIHN0YXJ0dXAgVk0gYXJndW1lbnRzIGZvciB0aGUgVG9tY2F0IHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFsbFBhdGggaW5zdGFsbGF0aW9uIHBhdGggZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gY29uZmlnUGF0aCBjb25maWd1cmF0aW9uIHBhdGggZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gZGVwbG95UGF0aCBkZXBsb3kgcGF0aCBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBpc1Rlc3RFbnYgdGVzdCBlbnZpcm9ubWVudCBmbGFnCi0JICogQHJldHVybiBhcnJheSBvZiBWTSBhcmd1bWVudHMgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoLCBib29sZWFuIGlzVGVzdEVudik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgSmF2YSBwb2xpY3kgZmlsZSBmb3IgdGhlIFRvbWNhdCBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ1BhdGggcGF0aCB0byBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBjb250ZW50cyBvZiBKYXZhIHBvbGljeSBmaWxlIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotCSAqIHNlcnZlciwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICogQHJldHVybiB0aGUgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBwYXRocyBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIFRvbWNhdFNlcnZlciBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGRldGVybWluZQotCSAqIHRoZSBiYXNlIHBhdGguCi0JICogQHJldHVybiBwYXRoIHRvIFRvbWNhdCBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyIHNlcnZlcik7Ci0KLQkvKioKLQkgKiBQcmVwYXJlIHNlcnZlciBydW50aW1lIGRpcmVjdG9yeS4gQ3JlYXRlIGNhdGFsaW5hIGluc3RhbmNlIHNldCBvZgotCSAqIGRpcmVjdG9yaWVzLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIFRvbWNhdCBpbnN0YW5jZSBkaXJlY3RvcnkgdG8gcHJlcGFyZQotCSAqIEByZXR1cm4gcmVzdWx0IG9mIGNyZWF0aW9uIG9wZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCBiYXNlRGlyKTsKLQkKLQkvKioKLQkgKiBQcmVwYXJlcyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBieSBtYWtpbmcgc3VyZSBpdCBleGlzdHMgYW5kIGlzCi0JICogaW5pdGlhbGl6ZWQgYXBwcm9wcmlhdGVseS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwbG95UGF0aCBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeQotCSAqICBiZWluZyBwcmVwYXJlZAotCSAqIEByZXR1cm4gc3RhdHVzIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCBkZXBsb3lQYXRoKTsKLQkKLQkvKioKLQkgKiBQcmVwYXJlIGRpcmVjdG9yeSBmb3Igc2VydmluZyBjb250ZXh0cyBkaXJlY3RseSBpZiBlbmFibGVkLgotCSAqIElmIG5vdCBlbmFibGVkLCByZXN0b3JlIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBUb21jYXQgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIHNlcnZlciBUb21jYXRTZXJ2ZXIgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXRlcm1pbmUKLQkgKiBpZiBzZXJ2aW5nIGRpcmVjdGx5IGlzIGVuYWJsZWQKLQkgKiBAcmV0dXJuIHN0YXR1cyByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGggYmFzZURpciwgVG9tY2F0U2VydmVyIHNlcnZlcik7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgInNoYXJlZCIgbG9hZGVyIHRvIHVzZSB3aXRoIHNlcnZpbmcKLQkgKiBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZy4gIFJldHVybnMgbnVsbCBpZiBzZXJ2aW5nIG1vZHVsZXMKLQkgKiB3aXRob3V0IHB1Ymxpc2hpbmcgaXMgbm90IHN1cHBvcnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIFRvbWNhdCBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIG5hbWUgb2Ygc2hhcmVkIGxvYWRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkTG9hZGVyKElQYXRoIGJhc2VEaXIpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcnZlciBzdXBwb3J0cyBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcnZlciBzdXBwb3J0cyBhIGRlYnVnIGFyZ3VtZW50LiBUaGlzCi0JICogYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYWZmZWN0IHRoZSBsZXZlbCBvZiBsb2dnaW5nLiAgTmV3ZXIKLQkgKiB2ZXJzaW9ucyBvZiBUb21jYXQgdXNlIGRpZmZlcmVudCBtZWFucyBvZiBjb250cm9sbGluZyBsb2dnaW5nCi0JICogYW5kIGlnbm9yZSB0aGlzIGFyZ3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBkZWJ1ZyBhcmd1bWVudCBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlYnVnQXJndW1lbnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMgc2VwYXJhdGUgY29udGV4dCBmaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMgc2VwYXJhdGUgY29udGV4dCBmaWxlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZG9yc2VkIGRpcmVjdG9yaWVzIGRlcml2ZWQgdXNpbmcgdGhlCi0JICogc3BlY2lmaWVkIGluc3RhbGwgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFsbFBhdGggaW5zdGFsbGF0aW9uIHBhdGggZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIFRoZSBlbmRvcnNlZCBkaXJlY3RvcmllcyBmb3IgdGhpcyBzZXJ2ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoIGluc3RhbGxQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFdlYk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0V2ViTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjg4YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0V2ViTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEEgV2ViIG1vZHVsZSBkZXBsb3llZCBvbiBUb21jYXQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFdlYk1vZHVsZSB7Ci0JLyoqCi0JICogR2V0IHRoZSBkb2N1bWVudCBiYXNlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aC4gKGNvbnRleHQgcm9vdCkKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgd2ViIG1vZHVsZSBpcyBhdXRvLXJlbG9hZGFibGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbG9hZGFibGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODRkZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yVmVyc2lvbkVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yVW5rbm93blZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyV3JvbmdWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbERpckRvZXNOb3RFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbERpclRyYWlsaW5nU2xhc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkVUb21jYXQ2MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nSlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdDYW50UmVhZENvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXJnZXQzMnJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFyZ2V0NDBydW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldDQxcnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXJnZXQ1MHJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFyZ2V0NTVydW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBvcnRVbmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRpbmdDb25maWd1cmF0aW9uVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5BZGRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjMzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjNDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjNDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjNTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjNTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTcGVjNjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydFNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lRGlyUHJlcGFyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ3VyYXRpb25UYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdDb250ZXh0Q29uZmlnVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2luZ0NvbnRleHRUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlclBvc3RQcm9jZXNzaW5nQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW51cFNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0aW5nUmVtb3ZlZFByb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nQ29udGV4dEZpbGVzVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0NvbnRleHRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZWRDb250ZXh0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90RGVsZXRlQ29udGV4dEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDbGVhbnVwU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hlclB1Ymxpc2hUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yV2ViTW9kdWxlc09ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRzSW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVDb250ZXh0Um9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxTZXJ2aWNlTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxOb1NlcnZpY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxFbmdpbmVOb3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclhNTEhvc3ROb3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxDb250ZXh0TWFuZ2VyTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoMzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxOdWxsQ29udGV4dEFyZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUHVibGlzaE5vdFN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hDb250ZXh0Tm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoQ291bGROb3RSZW1vdmVNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoTG9hZGVySmFyTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoVVJMQ29udmVydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hDYW50RGVsZXRlTG9hZGVySmFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaENhdGFsaW5hUHJvcHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoUGF0aER1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hQYXRoQ29uZmxpY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoUGF0aE1pc3Npbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5UG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5TWltZU1hcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVdlYk1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlTWltZU1hcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZVdlYk1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZVBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQWN0aW9uU2V0RGVidWdNb2RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldFNlY3VyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZXJEaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQWN0aW9uU2V0RGVwbG95RGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldFNlcnZlV2l0aG91dFB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWlkdG9yQWN0aW9uU2V0U2VwYXJhdGVDb250ZXh0RmlsZXM7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTA5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBydW50aW1lIHRhcmdldAotdGFyZ2V0MzJydW50aW1lPVRvbWNhdCB2My4yIHJ1bnRpbWUKLXRhcmdldDQwcnVudGltZT1Ub21jYXQgdjQuMCBydW50aW1lCi10YXJnZXQ0MXJ1bnRpbWU9VG9tY2F0IHY0LjEgcnVudGltZQotdGFyZ2V0NTBydW50aW1lPVRvbWNhdCB2NS4wIHJ1bnRpbWUKLXRhcmdldDU1cnVudGltZT1Ub21jYXQgdjUuNSBydW50aW1lCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFRhc2tzIChwcm9ncmVzcyBtb25pdG9ycykgLS0tLS0tLS0tLS0tLS0tCi1zYXZpbmdUYXNrPVNhdmluZy4uLgotbG9hZGluZ1Rhc2s9TG9hZGluZy4uLgotdXBkYXRpbmdDb25maWd1cmF0aW9uVGFzaz1VcGRhdGluZyBydW4tdGltZSBjb25maWd1cmF0aW9uLi4uCi1wdWJsaXNoU2VydmVyVGFzaz1QdWJsaXNoaW5nIHRvIHNlcnZlci4uLgotcHVibGlzaENvbmZpZ3VyYXRpb25UYXNrPVB1Ymxpc2hpbmcgdGhlIGNvbmZpZ3VyYXRpb24uLi4KLXB1Ymxpc2hlclB1Ymxpc2hUYXNrPVB1Ymxpc2hpbmcgezB9Li4uCi0KLXB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaz1QdWJsaXNoaW5nIE1FVEEtSU5GL2NvbnRleHQueG1sIGNvbmZpZ3VyYXRpb25zLi4uCi1jaGVja2luZ0NvbnRleHRUYXNrPUNoZWNraW5nIENvbnRleHQgezB9IGZvciBjb250ZXh0LnhtbC4uLgotc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2s9U2F2aW5nIGNvbnRleHQgY29uZmlndXJhdGlvbiB1cGRhdGVzLi4uCi1zZXJ2ZXJQb3N0UHJvY2Vzc2luZ0NvbXBsZXRlPUNvbnRleHQgY29uZmlndXJhdGlvbnMgYWRkZWQuCi0KLWNsZWFudXBTZXJ2ZXJUYXNrPVJlbW92aW5nIG9ic29sZXRlIGZpbGVzIGZyb20gc2VydmVyLi4uCi1kZXRlY3RpbmdSZW1vdmVkUHJvamVjdHM9UHJlcGFyaW5nIGxpc3Qgb2YgcmVtb3ZlZCBwcm9qZWN0cy4uLgotZGVsZXRpbmdDb250ZXh0RmlsZXNUYXNrPURlbGV0aW5nIG9ic29sZXRlIGNvbnRleHQgZmlsZXMgZnJvbSBzZXJ2ZXIuLi4KLWRlbGV0aW5nQ29udGV4dEZpbGU9RGVsZXRpbmcgb2Jzb2xldGUgY29udGV4dCBmaWxlIHswfS4uLgotZGVsZXRlZENvbnRleHRGaWxlPUNvbnRleHQgZmlsZSB7MH0gcmVtb3ZlZAotcnVudGltZURpclByZXBhcmVkPVJ1bnRpbWUgZGlyZWN0b3J5IHByZXBhcmVkCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgdG8gezB9OiB7MX0KLWVycm9yUHVibGlzaD1QdWJsaXNoaW5nIGZhaWxlZCB3aXRoIG11bHRpcGxlIGVycm9ycwotCi0jIEVkaXRvciBjb21tYW5kcyAodXNlZCBpbiB1bmRvL3JlZG8gbWVudXMpCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkTWltZU1hcHBpbmc9TUlNRSBNYXBwaW5nIEFkZGl0aW9uCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5TWltZU1hcHBpbmc9TUlNRSBNYXBwaW5nIENoYW5nZQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZU1pbWVNYXBwaW5nPU1JTUUgTWFwcGluZyBSZW1vdmFsCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlPVdlYiBNb2R1bGUgQWRkaXRpb24KLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlXZWJNb2R1bGU9V2ViIE1vZHVsZSBDaGFuZ2UKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVXZWJNb2R1bGU9V2ViIE1vZHVsZSBSZW1vdmFsCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5UG9ydD1Qb3J0IE51bWJlciBDaGFuZ2UKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25FZGl0V2ViTW9kdWxlUGF0aD1XZWIgTW9kdWxlIFBhdGggQ2hhbmdlCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tCi1jYW5BZGRNb2R1bGU9V2ViIG1vZHVsZSBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlcnZlci4KLXBvcnRTZXJ2ZXI9VG9tY2F0IGFkbWluIHBvcnQKLXBvcnRVbmtub3duPXVua25vd24gcG9ydAotCi0jIC0tLS0tLS0tLS0tLS0tLSBFcnJvcnMgYW5kIEluZm8gLS0tLS0tLS0tLS0tLS0tCi1lcnJvclZlcnNpb25FbXB0eT1UaGUgVG9tY2F0IHZlcnNpb24gbXVzdCBiZSBzcGVjaWZpZWQuCi1lcnJvclVua25vd25WZXJzaW9uPVVua25vd24gdmVyc2lvbiBvZiBUb21jYXQgd2FzIHNwZWNpZmllZC4KLWVycm9ySW5zdGFsbERpckVtcHR5PVRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtYXkgbm90IGJlIGVtcHR5LgotZXJyb3JJbnN0YWxsRGlyV3JvbmdWZXJzaW9uPVRoZSBuYW1lIG9mIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpbmRpY2F0ZXMgaXQgaXMgZm9yIGRpZmZlcmVudCB2ZXJzaW9uIG9mIFRvbWNhdC4KLWVycm9ySW5zdGFsbERpckRvZXNOb3RFeGlzdD1UaGUgc3BlY2lmaWVkIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGU9VGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIG5vdCB2YWxpZC4gSXQgaXMgbWlzc2luZyBleHBlY3RlZCBmaWxlIG9yIGZvbGRlciB7MH0uCi1lcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZTI9VGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIG5vdCB2YWxpZC4gSXQgaXMgbWlzc2luZyBleHBlY3RlZCBmaWxlIG9yIGZvbGRlciB7MH0gKGFsdGVybmF0ZSBuYW1lIHsxfSkuCi1lcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZTM9VGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIG5vdCB2YWxpZC4gSXQgaXMgbWlzc2luZyBleHBlY3RlZCBmaWxlIG9yIGZvbGRlciB7MH0gKGFsdGVybmF0ZSBuYW1lcyB7MX0pLgotZXJyb3JJbnN0YWxsRGlyVHJhaWxpbmdTbGFzaD1UaGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBoYXZlIGEgdHJhaWxpbmcgc2xhc2guCi1lcnJvckpSRT1UaGUgSlJFIGNvdWxkIG5vdCBiZSBmb3VuZC4gRWRpdCB0aGUgc2VydmVyIGFuZCBjaGFuZ2UgdGhlIEpSRSBsb2NhdGlvbi4KLWVycm9ySlJFVG9tY2F0NjA9VG9tY2F0IHZlcnNpb24gNi4wIHJlcXVpcmVzIEoyU0UgNS4wIG9yIGxhdGVyLiAgQ2hhbmdlIHRoZSBKUkUgdG8gb25lIHRoYXQgbWVldHMgdGhpcyByZXF1aXJlbWVudC4KLWVycm9yUG9ydEludmFsaWQ9VGhlIHNlcnZlciBjYW5ub3QgYmUgc3RhcnRlZCBiZWNhdXNlIG9uZSBvciBtb3JlIG9mIHRoZSBwb3J0cyBhcmUgaW52YWxpZC4gT3BlbiB0aGUgc2VydmVyIGVkaXRvciBhbmQgY29ycmVjdCB0aGUgaW52YWxpZCBwb3J0cy4KLWVycm9yUG9ydEluVXNlPVBvcnQgezB9IHJlcXVpcmVkIGJ5IHsxfSBpcyBhbHJlYWR5IGluIHVzZS4gVGhlIHNlcnZlciBtYXkgYWxyZWFkeSBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2Vzcywgb3IgYSBzeXN0ZW0gcHJvY2VzcyBtYXkgYmUgdXNpbmcgdGhlIHBvcnQuIFwKLSAgVG8gc3RhcnQgdGhpcyBzZXJ2ZXIgeW91IHdpbGwgbmVlZCB0byBzdG9wIHRoZSBvdGhlciBwcm9jZXNzIG9yIGNoYW5nZSB0aGUgcG9ydCBudW1iZXIocykuCi1lcnJvclBvcnRzSW5Vc2U9U2V2ZXJhbCBwb3J0cyAoezB9KSByZXF1aXJlZCBieSB7MX0gYXJlIGFscmVhZHkgaW4gdXNlLiBUaGUgc2VydmVyIG1heSBhbHJlYWR5IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLCBvciBhIHN5c3RlbSBwcm9jZXNzIG1heSBiZSB1c2luZyB0aGUgcG9ydC4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHN0b3AgdGhlIG90aGVyIHByb2Nlc3Mgb3IgY2hhbmdlIHRoZSBwb3J0IG51bWJlcihzKS4KLSMgdGhlIHswfSBpbiB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBsb2NhdGlvbiAocGF0aCkgb2YgdGhlIG1pc3Npbmcgb3IgY29ycnVwdCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotZXJyb3JOb0NvbmZpZ3VyYXRpb249VGhlIFRvbWNhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhdCB7MH0gaXMgbWlzc2luZy4gQ2hlY2sgdGhlIHNlcnZlciBmb3IgZXJyb3JzLgotZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uPUNvdWxkIG5vdCBsb2FkIHRoZSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXQgezB9LiBUaGUgY29uZmlndXJhdGlvbiBtYXkgYmUgY29ycnVwdCBvciBpbmNvbXBsZXRlLgotZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uPUNvdWxkIG5vdCBzYXZlIHRoZSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHswfS4KLWVycm9yUHVibGlzaENvbmZpZ3VyYXRpb249Q291bGQgbm90IHB1Ymxpc2ggc2VydmVyIGNvbmZpZ3VyYXRpb246IHswfS4KLWVycm9yUHVibGlzaFNlcnZlcj1Db3VsZCBub3QgcHVibGlzaCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb3IgezB9LgotZXJyb3JDb3VsZE5vdERlbGV0ZUNvbnRleHRGaWxlPUNvdWxkIG5vdCBkZWxldGUgb2Jzb2xldGUgY29udGV4dCBmaWxlOiB7MH0KLWVycm9yQ2xlYW51cFNlcnZlcj1Db3VsZCBub3QgY2xlYW4gc2VydmVyIG9mIG9ic29sZXRlIGZpbGVzOiB7MH0KLWVycm9yV2ViTW9kdWxlc09ubHk9VG9tY2F0IG9ubHkgc3VwcG9ydHMgcnVubmluZyBKMkVFIFdlYiBtb2R1bGVzLgotZXJyb3JOb1J1bnRpbWU9Q2Fubm90IGFkZCBtb2R1bGVzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yU3BlYzMyPVRvbWNhdCB2ZXJzaW9uIDMuMiBvbmx5IHN1cHBvcnRzIEoyRUUgMS4yIFdlYiBtb2R1bGVzCi1lcnJvclNwZWM0MD1Ub21jYXQgdmVyc2lvbiA0LjAgb25seSBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzCi1lcnJvclNwZWM0MT1Ub21jYXQgdmVyc2lvbiA0LjEgb25seSBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzCi1lcnJvclNwZWM1MD1Ub21jYXQgdmVyc2lvbiA1LjAgb25seSBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzCi1lcnJvclNwZWM1NT1Ub21jYXQgdmVyc2lvbiA1LjUgb25seSBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzCi1lcnJvclNwZWM2MD1Ub21jYXQgdmVyc2lvbiA2LjAgb25seSBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCAxLjQsIGFuZCBKYXZhIEVFIDUgV2ViIG1vZHVsZXMKLWVycm9yRHVwbGljYXRlQ29udGV4dFJvb3Q9VHdvIG9yIG1vcmUgV2ViIG1vZHVsZXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcm9vdCAoezB9KS4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHJlbW92ZSB0aGUgZHVwbGljYXRlKHMpLgotZXJyb3JDb3VsZE5vdExvYWRDb250ZXh0WG1sPUNvdWxkIG5vdCBsb2FkIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB7MH0gY29udGV4dCBkdWUgdG8gYSBzeW50YXggZXJyb3Igb3Igb3RoZXIgZXhjZXB0aW9uLgotZXJyb3JYTUxTZXJ2aWNlTm90Rm91bmQ9U2VydmljZSBcInswfVwiIHdhcyBub3QgZm91bmQuCi1lcnJvclhNTE5vU2VydmljZT1ObyBTZXJ2aWNlIHdhcyBmb3VuZC4KLWVycm9yWE1MRW5naW5lTm90Rm91bmQ9RW5naW5lIGVsZW1lbnQgbm90IGZvdW5kIHVuZGVyIFNlcnZpY2UgXCJ7MH1cIi4KLWVycm9yWE1MSG9zdE5vdEZvdW5kPUhvc3QgXCJ7MH1cIiB3YXMgbm90IGZvdW5kIHVuZGVyIEVuZ2luZSBcInsxfVwiIGFuZCBTZXJ2aWNlIFwiezJ9XCIuCi1lcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGg9Q29udGV4dCB3aXRoIHBhdGggXCJ7MH1cIiB3YXMgbm90IGZvdW5kIHVuZGVyIFNlcnZpY2UgXCJ7MX1cIiwgRW5naW5lIFwiezJ9XCIsIGFuZCBIb3N0IFwiezN9XCIuCi1lcnJvclhNTENvbnRleHRNYW5nZXJOb3RGb3VuZD1Db250ZXh0TWFuYWdlciBlbGVtZW50IHdhcyBub3QgZm91bmQuCi1lcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGgzMj1Db250ZXh0IHdpdGggcGF0aCBcInswfVwiIHdhcyBub3QgZm91bmQgdW5kZXIgQ29udGV4dE1hbmFnZXIuCi1lcnJvclhNTE51bGxDb250ZXh0QXJnPUNvbnRleHQgYXJndW1lbnQgbWF5IG5vdCBiZSBudWxsLgotZXJyb3JOb1B1Ymxpc2hOb3RTdXBwb3J0ZWQ9U2VydmluZyBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyLgotZXJyb3JQdWJsaXNoQ29udGV4dE5vdEZvdW5kPUNvbnRleHQgbm90IGZvdW5kIGZvciBtb2R1bGUgezB9LgotZXJyb3JQdWJsaXNoQ291bGROb3RSZW1vdmVNb2R1bGU9Q291bGQgbm90IHJlbW92ZSBtb2R1bGUgezB9LgotZXJyb3JQdWJsaXNoTG9hZGVySmFyTm90Rm91bmQ9TG9hZGVyIGphciBub3QgZm91bmQgZm9yIHNlcnZlciBJRDogezB9LgotZXJyb3JQdWJsaXNoVVJMQ29udmVydD1FeGNlcHRpb24gb2NjdXJyZWQgY29udmVydGluZyBVUkwgezB9OiB7MX0uCi1lcnJvclB1Ymxpc2hDYW50RGVsZXRlTG9hZGVySmFyPVVuYWJsZSB0byBkZWxldGUgdGhlIGN1c3RvbSBsb2FkZXIgamFyIHswfSBmcm9tIFRvbWNhdCBzZXJ2ZXIuCi1lcnJvclB1Ymxpc2hDYXRhbGluYVByb3BzPUV4Y2VwdGlvbiBvY2N1cnJlZCBtb2RpZnlpbmcgY2F0YWxpbmEucHJvcGVydGllczogezB9LgotZXJyb3JQdWJsaXNoUGF0aER1cD1NdWx0aXBsZSBDb250ZXh0cyBoYXZlIGEgcGF0aCBvZiAiezB9Ii4KLWVycm9yUHVibGlzaFBhdGhDb25mbGljdD1Db250ZXh0IHdpdGggcGF0aCAiezB9IiBjb25mbGljdHMgd2l0aCBhbm90aGVyIENvbnRleHQgd2l0aCBwYXRoICJ7MX0iLgotZXJyb3JQdWJsaXNoUGF0aE1pc3Npbmc9QSBDb250ZXh0IHdhcyBmb3VuZCB3aXRoIG5vIHBhdGguCi0KLXdhcm5pbmdKUkU9VG9tY2F0IHJlcXVpcmVzIGEgSmF2YSBTREsgaW4gb3JkZXIgdG8gY29tcGlsZSBKU1AgZmlsZXMuIEVuc3VyZSB0aGF0IHRoZSBKUkUgcHJlZmVyZW5jZSBzZXR0aW5ncyBwb2ludCB0byBhbiBTREsgaW5zdGFsbCBsb2NhdGlvbi4KLXdhcm5pbmdDYW50UmVhZENvbmZpZz1DYW5ub3QgcmVhZCB0aGUgVG9tY2F0IGNvbmZpZ3VyYXRpb24uCi0KLSMgQWN0aW9ucyAodXNlZCBpbiB1bmRvL3JlZG8gbWVudXMpCi1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZWN1cmU9VG9tY2F0IFNlY3VyaXR5IE9wdGlvbiBDaGFuZ2UKLXNlcnZlckVkaXRvckFjdGlvblNldERlYnVnTW9kZT1Ub21jYXQgRGVidWcgTG9nZ2luZyBPcHRpb24gQ2hhbmdlCi1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZXJEaXJlY3Rvcnk9VG9tY2F0IFNlcnZlciBQYXRoIENoYW5nZQotc2VydmVyRWRpdG9yQWN0aW9uU2V0RGVwbG95RGlyZWN0b3J5PVRvbWNhdCBEZXBsb3kgUGF0aCBDaGFuZ2UKLXNlcnZlckVkaXRvckFjdGlvblNldFNlcnZlV2l0aG91dFB1Ymxpc2g9U2VydmUgTW9kdWxlcyBXaXRob3V0IFB1Ymxpc2ggT3B0aW9uIENoYW5nZQotc2VydmVyRWlkdG9yQWN0aW9uU2V0U2VwYXJhdGVDb250ZXh0RmlsZXM9UHVibGlzaCBDb250ZXh0cyBUbyBTZXBhcmF0ZSBGaWxlcyBPcHRpb24gQ2hhbmdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01pbWVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZiMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NaW1lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi0vKioKLSAqIEEgbWltZSBtYXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmcgaW1wbGVtZW50cyBJTWltZU1hcHBpbmcgewotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjsKLQlwcml2YXRlIFN0cmluZyBtaW1lVHlwZTsKLQotCS8qKgotCSAqIE1pbWVNYXBwaW5nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbiBhbiBleHRlbnNpb24KLQkgKiBAcGFyYW0gbWltZVR5cGUgYSBtaW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQl0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uLgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZS4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzMyZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBUaHJlYWQgdXNlZCB0byBwaW5nIHNlcnZlciB0byB0ZXN0IHdoZW4gaXQgaXMgc3RhcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIFBpbmdUaHJlYWQgewotCS8vIGRlbGF5IGJlZm9yZSBwaW5naW5nIHN0YXJ0cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMjAwMDsKLQotCS8vIGRlbGF5IGJldHdlZW4gcGluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDI1MDsKLQotCS8vIG1heGltdW0gbnVtYmVyIG9mIHBpbmdzIGJlZm9yZSBnaXZpbmcgdXAKLQlwcml2YXRlIGludCBtYXhQaW5nczsKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFBpbmdUaHJlYWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gbWF4UGluZ3MgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHRyeSBwaW5naW5nLCBvciAtMSB0byBjb250aW51ZSBmb3JldmVyCi0JICogQHBhcmFtIGJlaGF2aW91cgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBpbnQgbWF4UGluZ3MsIFRvbWNhdFNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMudXJsID0gdXJsOwotCQl0aGlzLm1heFBpbmdzID0gbWF4UGluZ3M7Ci0JCXRoaXMuYmVoYXZpb3VyID0gYmVoYXZpb3VyOwotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlRvbWNhdCBQaW5nIFRocmVhZCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogUGluZyB0aGUgc2VydmVyIHVudGlsIGl0IGlzIHN0YXJ0ZWQuIFRoZW4gc2V0IHRoZSBzZXJ2ZXIKLQkgKiBzdGF0ZSB0byBTVEFURV9TVEFSVEVELgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBpbmcoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoUElOR19ERUxBWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQl3aGlsZSAoIXN0b3ApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvdW50ID09IG1heFBpbmdzKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBjb3VsZCBub3Qgc3RvcCBzZXJ2ZXIiKTsKLQkJCQkJfQotCQkJCQlzdG9wID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNvdW50Kys7Ci0JCQkJCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogcGluZ2luZyAiICsgY291bnQpOwotCQkJCVVSTCBwaW5nVXJsID0gbmV3IFVSTCh1cmwpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubiA9IHBpbmdVcmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkoKEh0dHBVUkxDb25uZWN0aW9uKWNvbm4pLmdldFJlc3BvbnNlQ29kZSgpOwotCQotCQkJCS8vIHBpbmcgd29ya2VkIC0gc2VydmVyIGlzIHVwCi0JCQkJaWYgKCFzdG9wKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN1Y2Nlc3MiKTsKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJCWJlaGF2aW91ci5zZXRTZXJ2ZXJTdGFydGVkKCk7Ci0JCQkJfQotCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCWJlaGF2aW91ci5zZXRTZXJ2ZXJTdGFydGVkKCk7Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGZhaWxlZCIpOwotCQkJCS8vIHBpbmdpbmcgZmFpbGVkCi0JCQkJaWYgKCFzdG9wKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoUElOR19JTlRFUlZBTCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlbGwgdGhlIHBpbmdpbmcgdG8gc3RvcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBzdG9wcGluZyIpOwotCQlzdG9wID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkYWRkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBpbnQKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLCBpbnQgc3R5bGUpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIHN0eWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoT3BlcmF0aW9uMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoT3BlcmF0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTU2N2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaE9wZXJhdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEhlbHBlcjsKLS8qKgotICogVG9tY2F0IHB1Ymxpc2ggaGVscGVyLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE9wZXJhdGlvbjIgZXh0ZW5kcyBQdWJsaXNoT3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQlwcm90ZWN0ZWQgaW50IGtpbmQ7Ci0JcHJvdGVjdGVkIGludCBkZWx0YUtpbmQ7Ci0JcHJpdmF0ZSBQdWJsaXNoSGVscGVyIGhlbHBlcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgb3BlcmF0aW9uIG9iamVjdCB0byBwdWJsaXNoIHRoZSBzcGVjaWZpZWQgbW9kdWxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBzZXJ2ZXIgdG8gd2hpY2ggdGhlIG1vZHVsZSB3aWxsIGJlIHB1Ymxpc2hlZAotCSAqIEBwYXJhbSBraW5kIGtpbmQgb2YgcHVibGlzaAotCSAqIEBwYXJhbSBtb2R1bGUgbW9kdWxlIHRvIHB1Ymxpc2gKLQkgKiBAcGFyYW0gZGVsdGFLaW5kIGtpbmQgb2YgY2hhbmdlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb24yKFRvbWNhdFNlcnZlckJlaGF2aW91ciBzZXJ2ZXIsIGludCBraW5kLCBJTW9kdWxlW10gbW9kdWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCXN1cGVyKCJQdWJsaXNoIHRvIHNlcnZlciIsICJQdWJsaXNoIFdlYiBtb2R1bGUgdG8gVG9tY2F0IHNlcnZlciIpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JCXRoaXMuZGVsdGFLaW5kID0gZGVsdGFLaW5kOwotCQlJUGF0aCBiYXNlID0gc2VydmVyLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCWhlbHBlciA9IG5ldyBQdWJsaXNoSGVscGVyKGJhc2UuYXBwZW5kKCJ0ZW1wIikudG9GaWxlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gV2UgYXJlIGRvb21lZCB3aXRob3V0IGEgYmFzZSBkaXJlY3RvcnkuICBIb3dldmVyLCBhbGxvdyB0aGUgY2F0YXN0cm9waGUKLQkJCS8vIHRvIG9jY3VyIGVsc2V3aGVyZSBhbmQgaG9wZSBmb3IgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4KLQkJCWhlbHBlciA9IG5ldyBQdWJsaXNoSGVscGVyKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQdWJsaXNoT3BlcmF0aW9uI2dldE9yZGVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFB1Ymxpc2hPcGVyYXRpb24jZ2V0S2luZCgpCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQdWJsaXNoT3BlcmF0aW9uI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobW9kdWxlLmxlbmd0aCA9PSAxKSB7IC8vIHdlYiBtb2R1bGUKLQkJCXB1Ymxpc2hEaXIobW9kdWxlWzBdLCBzdGF0dXMsIG1vbml0b3IpOwotCQl9IGVsc2UgeyAvLyB1dGlsaXR5IG1vZHVsZQotCQkJcHVibGlzaEphcihzdGF0dXMsIG1vbml0b3IpOwotCQl9Ci0JCXRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JCXNlcnZlci5zZXRNb2R1bGVQdWJsaXNoU3RhdGUyKG1vZHVsZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoRGlyKElNb2R1bGUgbW9kdWxlMiwgTGlzdCBzdGF0dXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gc2VydmVyLmdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGUyKTsKLQkJCi0JCS8vIFJlbW92ZSBpZiByZXF1ZXN0ZWQgb3IgaWYgcHJldmlvdXNseSBwdWJsaXNoZWQgYW5kIGFyZSBub3cgc2VydmluZyB3aXRob3V0IHB1Ymxpc2hpbmcKLQkJaWYgKGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOIHx8IGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVECi0JCQkJfHwgc2VydmVyLmdldFRvbWNhdFNlcnZlcigpLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkgewotCQkJRmlsZSBmID0gcGF0aC50b0ZpbGUoKTsKLQkJCWlmIChmLmV4aXN0cygpKSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXQgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShmLCBtb25pdG9yKTsKLQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJfQotCQkJCi0JCQlpZiAoZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQKLQkJCQkJfHwgc2VydmVyLmdldFRvbWNhdFNlcnZlcigpLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiB8fCBraW5kID09IElTZXJ2ZXIuUFVCTElTSF9GVUxMKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IHNlcnZlci5nZXRSZXNvdXJjZXMobW9kdWxlKTsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gaGVscGVyLnB1Ymxpc2hGdWxsKG1yLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCQkKLQkJaW50IHNpemUgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RhdHVzW10gc3RhdCA9IGhlbHBlci5wdWJsaXNoRGVsdGEoZGVsdGFbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoSmFyKExpc3Qgc3RhdHVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHNlcnZlci5nZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkobW9kdWxlWzBdKTsKLQkJcGF0aCA9IHBhdGguYXBwZW5kKCJXRUItSU5GIikuYXBwZW5kKCJsaWIiKTsKLQkJSVBhdGggamFyUGF0aCA9IHBhdGguYXBwZW5kKG1vZHVsZVsxXS5nZXROYW1lKCkgKyAiLmphciIpOwotCQkKLQkJLy8gUmVtb3ZlIGlmIHJlcXVlc3RlZCBvciBpZiBwcmV2aW91c2x5IHB1Ymxpc2hlZCBhbmQgYXJlIG5vdyBzZXJ2aW5nIHdpdGhvdXQgcHVibGlzaGluZwotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQKLQkJCQl8fCBzZXJ2ZXIuZ2V0VG9tY2F0U2VydmVyKCkuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQlpZiAoamFyUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkKLQkJCQlqYXJQYXRoLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQkJCi0JCQlpZiAoZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQKLQkJCQkJfHwgc2VydmVyLmdldFRvbWNhdFNlcnZlcigpLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCS8vIGF2b2lkIGNoYW5nZXMgaWYgbm8gY2hhbmdlcyB0byBtb2R1bGUgc2luY2UgbGFzdCBwdWJsaXNoCi0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsIHx8IGRlbHRhLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbWFrZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdAotCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQlwYXRoLnRvRmlsZSgpLm1rZGlycygpOwotCQkKLQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBzZXJ2ZXIuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JCUlTdGF0dXNbXSBzdGF0ID0gaGVscGVyLnB1Ymxpc2haaXAobXIsIGphclBhdGgsIG1vbml0b3IpOwotCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRocm93IGEgQ29yZUV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9mCi0JICogZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBMaXN0IGNvbnRhaW5pbmcgZXJyb3IgYW5kIHdhcm5pbmcgSVN0YXR1cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB0aHJvd0V4Y2VwdGlvbihMaXN0IHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHN0YXR1cy5zaXplKCkgPT0gMSkgewotCQkJSVN0YXR1cyBzdGF0dXMyID0gKElTdGF0dXMpIHN0YXR1cy5nZXQoMCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMyKTsKLQkJfQotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoY2hpbGRyZW4pOwotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yUHVibGlzaDsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBjaGlsZHJlbiwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRBcnJheVRvTGlzdChMaXN0IGxpc3QsIElTdGF0dXNbXSBhKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgYSA9PSBudWxsIHx8IGEubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCWxpc3QuYWRkKGFbaV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzZDU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoVGFza0RlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFRhc2sgZXh0ZW5kcyBQdWJsaXNoVGFza0RlbGVnYXRlIHsKLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KSB7Ci0JCWlmIChtb2R1bGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVRvbWNhdFNlcnZlckJlaGF2aW91ciB0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJaWYgKCF0b21jYXRTZXJ2ZXIuZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVzLmdldChpKTsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikga2luZExpc3QuZ2V0KGkpOwotCQkJdGFza3MuYWRkKG5ldyBQdWJsaXNoT3BlcmF0aW9uMih0b21jYXRTZXJ2ZXIsIGtpbmQsIG1vZHVsZSwgaW4uaW50VmFsdWUoKSkpOwotCQl9Ci0JCQotCQlyZXR1cm4gKFB1Ymxpc2hPcGVyYXRpb25bXSkgdGFza3MudG9BcnJheShuZXcgUHVibGlzaE9wZXJhdGlvblt0YXNrcy5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDUxMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoSGVscGVyOwotLyoqCi0gKiBUb21jYXQgdjMuMiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDMyQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSEFORExFUiA9ICJvcmcuYXBhY2hlLnRvbWNhdC5zZXJ2aWNlLmh0dHAuSHR0cENvbm5lY3Rpb25IYW5kbGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUEFDSEVfSEFORExFUiA9ICJvcmcuYXBhY2hlLnRvbWNhdC5zZXJ2aWNlLmNvbm5lY3Rvci5BanAxMkNvbm5lY3Rpb25IYW5kbGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfU09DS0VUX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS50b21jYXQubmV0LlNTTFNvY2tldEZhY3RvcnkiOwotCi0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlOwotCXByb3RlY3RlZCBGYWN0b3J5IHNlcnZlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXJEaXJ0eTsKLQotCXByb3RlY3RlZCBXZWJBcHBEb2N1bWVudCB3ZWJBcHBEb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCB0b21jYXRVc2Vyc0RvY3VtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBwb2xpY3lGaWxlOwotCi0JLyoqCi0JICogVG9tY2F0MzJDb25maWd1cmF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqLwotCXB1YmxpYyBUb21jYXQzMkNvbmZpZ3VyYXRpb24oSUZvbGRlciBwYXRoKSB7Ci0JCXN1cGVyKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gc2VydmVyIHBvcnQuCi0JICogQHJldHVybiBUb21jYXRTZXJ2ZXJQb3J0Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBvcnQuZ2V0TmFtZSgpLmVxdWFscygiSFRUUCBDb25uZWN0b3IiKSkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmaXggdGhhdCBpcyB1c2VkIGluIGZyb250IG9mIHRoZQotCSAqIHdlYiBtb2R1bGUgcGF0aCBwcm9wZXJ0eS4gKGUuZy4gIndlYmFwcHMiKQotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlUHJlZml4KCkgewotCQlyZXR1cm4gIndlYmFwcHMvIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCWlmICh3ZWJBcHBEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQotCQlyZXR1cm4gd2ViQXBwRG9jdW1lbnQuZ2V0TWltZU1hcHBpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIG9iamVjdCAocm9vdCBvZiBzZXJ2ZXIueG1sKS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmludGVybmFsLnhtbC5zZXJ2ZXIzMi5TZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29ubmVjdG9yIFtdIGNvbm5lY3RvcnMgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb25uZWN0b3JzKCk7Ci0JCQlpZiAoY29ubmVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOwotCQkJCQlpbnQgcGFyYW1Db3VudCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXJDb3VudCgpOwotCQkJCQlTdHJpbmcgaGFuZGxlciA9IG51bGw7Ci0JCQkJCVN0cmluZyBuYW1lID0gTWVzc2FnZXMucG9ydFVua25vd247Ci0JCQkJCVN0cmluZyBzb2NrZXRGYWN0b3J5ID0gbnVsbDsKLQkJCQkJU3RyaW5nIHByb3RvY29sID0gIlRDUElQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1Db3VudDsgaisrKSB7Ci0JCQkJCQlQYXJhbWV0ZXIgcCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXIoaik7Ci0JCQkJCQlpZiAoInBvcnQiLmVxdWFscyhwLmdldE5hbWUoKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChwLmdldFZhbHVlKCkpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoImhhbmRsZXIiLmVxdWFscyhwLmdldE5hbWUoKSkpCi0JCQkJCQkJaGFuZGxlciA9IHAuZ2V0VmFsdWUoKTsKLQkJCQkJCWVsc2UgaWYgKCJzb2NrZXRGYWN0b3J5Ii5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJCQkJCXNvY2tldEZhY3RvcnkgPSBwLmdldFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKEhUVFBfSEFORExFUi5lcXVhbHMoaGFuZGxlcikpIHsKLQkJCQkJCXByb3RvY29sID0gIkhUVFAiOwotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJCWlmIChTU0xfU09DS0VUX0ZBQ1RPUlkuZXF1YWxzKHNvY2tldEZhY3RvcnkpKSB7Ci0JCQkJCQkJcHJvdG9jb2wgPSAiU1NMIjsKLQkJCQkJCQluYW1lID0gIlNTTCBDb25uZWN0b3IiOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluYW1lID0gIkhUVFAgQ29ubmVjdG9yIjsKLQkJCQkJCQlhZHZhbmNlZCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKEFQQUNIRV9IQU5ETEVSLmVxdWFscyhoYW5kbGVyKSkKLQkJCQkJCW5hbWUgPSAiQXBhY2hlIENvbm5lY3RvciI7Ci0JCQkJCWlmIChoYW5kbGVyICE9IG51bGwpCi0JCQkJCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQoaSArICIiLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkKLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b21jYXQtdXNlcnMueG1sIGRvY3VtZW50LgotCSAqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRUb21jYXRVc2Vyc0RvY3VtZW50KCkgewotCQlyZXR1cm4gdG9tY2F0VXNlcnNEb2N1bWVudDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCUNvbnRleHQgW10gY29udGV4dHMgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCQkJCQlTdHJpbmcgcmVsb2FkID0gY29udGV4dC5nZXRSZWxvYWRhYmxlKCk7Ci0JCQkJCWlmIChyZWxvYWQgPT0gbnVsbCkKLQkJCQkJCXJlbG9hZCA9ICJmYWxzZSI7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKGNvbnRleHQuZ2V0UGF0aCgpLCAKLQkJCQkJCWNvbnRleHQuZ2V0RG9jQmFzZSgpLCBjb250ZXh0LmdldFNvdXJjZSgpLAotCQkJCQkJcmVsb2FkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA/IHRydWUgOiBmYWxzZSk7Ci0JCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBwcm9qZWN0IHJlZnMiLCBlKTsKLQkJfQotCQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgpIHsKLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldFNlcnZlcldvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQobW9kdWxlLmdldFBhdGgoKSk7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIGNvbnRleHQpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA1KTsKLQkKLQkJCS8vIGNoZWNrIGZvciB0b21jYXQucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2My4yIGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJ0b21jYXQucG9saWN5IikudG9GaWxlKCkpOwotCQkJaW4ucmVhZCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBjcmVhdGUgc2VydmVyLnhtbAotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMiIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChwYXRoLmFwcGVuZCgid2ViLnhtbCIpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNpbXBvcnRGcm9tUGF0aChJUGF0aCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRGcm9tUGF0aChJUGF0aCBwYXRoLCBib29sZWFuIGlzVGVzdEVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWQocGF0aCwgbW9uaXRvcik7Ci0JCQotCQkvLyBmb3IgdGVzdCBlbnZpcm9ubWVudCwgcmVtb3ZlIGV4aXN0aW5nIGNvbnRleHRzIHNpbmNlIGFuIGluc3RhbmNlCi0JCS8vIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBzZXJ2ZXIueG1sIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQl3aGlsZSAoc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dCgwKSkgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDgwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgdG9tY2F0LnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjMuMiBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LnBvbGljeSIpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIG51bGwpKTsKLQkKLQkJCS8vIGxvYWQgc2VydmVyLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzIiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KGluKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlcik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KGZpbGUpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LXVzZXJzLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB0b21jYXQucG9saWN5Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGlmIHRydWUsIHRoZSBmaWxlcyB3aWxsIGJlIHNhdmVkLCByZWdhcmRsZXNzCi0JICogIG9mIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gbW9kaWZpZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA1KTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBzYXZlIGZpbGVzCi0JCQlpZiAoZm9yY2VEaXJ0eSB8fCBpc1NlcnZlckRpcnR5KQotCQkJCXNlcnZlckZhY3Rvcnkuc2F2ZShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9PU1N0cmluZygpLCB0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJ0b21jYXQucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIEFsbCBmaWxlcyBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGRlc2luYXRpb24gcGF0aCBmb3IgdGhlIGZpbGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZvbGRlciBhIGZvbGRlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgOTAwKTsKLQkJCQotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJCWVsc2UKLQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gc2F2ZSB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZmlsZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSB0b21jYXQucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQucG9saWN5Iik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjMuMiBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5jcmVhdGVDb250ZXh0KGluZGV4KTsKLQotCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCWNvbnRleHQuc2V0U291cmNlKG1vZHVsZS5nZXRNZW1lbnRvKCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2NhbGl6ZSB0aGUgd2ViIHByb2plY3RzIGluIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBiYXNlRGlyIHJ1bnRpbWUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gZGVwbG95RGlyIGRlcGxveW1lbnQgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIHNlcnZlcjIgYSBzZXJ2ZXIgdHlwZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnVwZGF0aW5nQ29uZmlndXJhdGlvblRhc2ssIDEwMCk7Ci0JCQlJUGF0aCBjb25mRGlyID0gYmFzZURpci5hcHBlbmQoImNvbmYiKTsKLQkJCQotCQkJVG9tY2F0MzJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBUb21jYXQzMkNvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQljb25maWcubG9hZChjb25mRGlyLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAzMDApKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJaWYgKHNlcnZlcjIuaXNUZXN0RW52aXJvbm1lbnQoKSkgewotCQkJCWNvbmZpZy5zZXJ2ZXIuZ2V0Q29udGV4dE1hbmFnZXIoKS5zZXRIb21lKGJhc2VEaXIudG9PU1N0cmluZygpKTsKLQkJCQljb25maWcuaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkgYWRkIHJvb3QgbW9kdWxlIGlmIHJ1bm5pbmcgaW4gYSB0ZXN0IGVudiAoaS5lLiBub3Qgb24gdGhlIGluc3RhbGxhdGlvbikKLQkJCWJvb2xlYW4gYWRkUm9vdFdlYmFwcCA9IHNlcnZlcjIuaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkJCQotCQkJLy8gSWYgbm90IGRlcGxveWluZyB0byAid2ViYXBwcyIsIGNvbnRleHQgZG9jQmFzZSBhdHRyaWJ1dGVzIG5lZWQgdXBkYXRpbmcKLQkJCWJvb2xlYW4gZGVwbG95aW5nVG9XZWJhcHBzID0gIndlYmFwcHMiLmVxdWFscyhzZXJ2ZXIyLmdldERlcGxveURpcmVjdG9yeSgpKTsKLQkJCQotCQkJTWFwIHBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoU2VydmVyLCBzZXJ2ZXIyLmdldFNlcnZlcigpLmdldE5hbWUoKSksIG51bGwpOwotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IGNvbmZpZy5zZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCi0JCQkJCS8vIE5vcm1hbGl6ZSBwYXRoIGFuZCBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBTYXZlIGEgY29weSBvZiBvcmlnaW5hbCBpbiBjYXNlIGl0J3MgIi8iCi0JCQkJCQlTdHJpbmcgb3JpZ1BhdGggPSBwYXRoOwotCQkJCQkJLy8gTm9ybWFsaXplICIvIiB0byAiIgotCQkJCQkJaWYgKCIvIi5lcXVhbHMocGF0aCkpIHsKLQkJCQkJCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb250ZXh0IHBhdGggaXMgYmVpbmcgY2hhbmdlZCBmcm9tIFwiL1wiIHRvIFwiXCIuIik7Ci0JCQkJCQkJcGF0aCA9ICIiOwotCQkJCQkJCWNvbnRleHQuc2V0UGF0aChwYXRoKTsKLQkJCQkJCQljb25maWcuaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIENvbnRleHQgcGF0aHMgdGhhdCBhcmUgdGhlIHNhbWUgb3IgZGlmZmVyIG9ubHkgaW4gY2FzZSBhcmUgbm90IGFsbG93ZWQKLQkJCQkJCVN0cmluZyBsY1BhdGggPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCQlpZiAoIXBhdGhNYXAuY29udGFpbnNLZXkobGNQYXRoKSkgewotCQkJCQkJCXBhdGhNYXAucHV0KGxjUGF0aCwgb3JpZ1BhdGgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG90aGVyUGF0aCA9IChTdHJpbmcpcGF0aE1hcC5nZXQobGNQYXRoKTsKLQkJCQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCQlvcmlnUGF0aC5lcXVhbHMob3RoZXJQYXRoKSA/IE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaFBhdGhEdXAsIG9yaWdQYXRoKSAKLQkJCQkJCQkJCQkJOiBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoQ29uZmxpY3QsIG9yaWdQYXRoLCBvdGhlclBhdGgpKTsKLQkJCQkJCQltcy5hZGQocyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCU1lc3NhZ2VzLmVycm9yUHVibGlzaFBhdGhNaXNzaW5nKTsKLQkJCQkJCW1zLmFkZChzKTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIGRlZmF1bHQgd2ViYXBwIGhhcyBub3QgYmVlbiBmb3VuZCwgY2hlY2sgdGhpcyBvbmUKLQkJCQkJLy8gVE9ETyBOZWVkIHRvIGFkZCBhIHJvb3QgY29udGV4dCBpZiBkZXBsb3lpbmcgdG8gd2ViYXBwcyBidXQgd2l0aCBhdXRvLWRlcGxveSBvZmYKLQkJCQkJaWYgKGFkZFJvb3RXZWJhcHAgJiYgIiIuZXF1YWxzKGNvbnRleHQuZ2V0UGF0aCgpKSkgewotCQkJCQkJLy8gQSBkZWZhdWx0IHdlYmFwcCBpcyBiZWluZyBkZXBsb3llZCwgZG9uJ3QgYWRkIG9uZQotCQkJCQkJYWRkUm9vdFdlYmFwcCA9IGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgbm90IGRlcGxveWluZyB0byAid2ViYXBwcyIsIGNvbnZlcnQgdG8gYWJzb2x1dGUgcGF0aCB1bmRlciBkZXBsb3kgZGlyCi0JCQkJCWlmICghZGVwbG95aW5nVG9XZWJhcHBzKSB7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gY29udGV4dC5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwICkJewotCQkJCQkJCVN0cmluZyBuYW1lID0gY29udGV4dC5nZXREb2NCYXNlKCk7Ci0JCQkJCQkJLy8gVXBkYXRlIGRvY0Jhc2Ugb25seSBpZiBuYW1lIGJlZ2lucyB3aXRoIHRoZSBleHBlY3RlZCBwcmVmaXgKLQkJCQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKGdldERvY0Jhc2VQcmVmaXgoKSkpIHsKLQkJCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGdldERvY0Jhc2VQcmVmaXgoKS5sZW5ndGgoKSk7Ci0JCQkJCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkZXBsb3lEaXIuYXBwZW5kKG5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQkJCWNvbmZpZy5pc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJZiBlcnJvcnMgYXJlIHByZXNlbnQsIHJldHVybiBzdGF0dXMKLQkJCWlmICghbXMuaXNPSygpKQotCQkJCXJldHVybiBtczsKLQotCQkJaWYgKGFkZFJvb3RXZWJhcHApIHsKLQkJCQkvLyBBZGQgYSBjb250ZXh0IGZvciB0aGUgZGVmYXVsdCB3ZWJhcHAKLQkJCQlDb250ZXh0IHJvb3RDb250ZXh0ID0gY29uZmlnLnNlcnZlckluc3RhbmNlLmNyZWF0ZUNvbnRleHQoMCk7Ci0JCQkJcm9vdENvbnRleHQuc2V0UGF0aCgiIik7Ci0JCQkJcm9vdENvbnRleHQuc2V0RG9jQmFzZShkZXBsb3lEaXIuYXBwZW5kKCJST09UIikudG9PU1N0cmluZygpKTsKLQkJCQlyb290Q29udGV4dC5zZXRSZWxvYWRhYmxlKCJmYWxzZSIpOwotCQkJCWNvbmZpZy5pc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCWNvbmZpZy5zYXZlKGNvbmZEaXIsIGZhbHNlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAzMCkpOwotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbG9jYWxpemluZyBjb25maWd1cmF0aW9uIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBleHRlbnNpb24gb2YgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWludCBjb24gPSBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb25uZWN0b3IoY29uKTsKLQkKLQkJCWludCBzaXplID0gY29ubmVjdG9yLmdldFBhcmFtZXRlckNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVBhcmFtZXRlciBwID0gY29ubmVjdG9yLmdldFBhcmFtZXRlcihpKTsKLQkJCQlpZiAoInBvcnQiLmVxdWFscyhwLmdldE5hbWUoKSkpIHsKLQkJCQkJcC5zZXRWYWx1ZShwb3J0ICsgIiIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQljb250ZXh0LnNldERvY0Jhc2UoZG9jQmFzZSk7Ci0JCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLCBkb2NCYXNlLCBudWxsLCByZWxvYWRhYmxlKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3Zpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgY2xlYW51cFNlcnZlcihJUGF0aCBjb25mRGlyLCBJUGF0aCBpbnN0YWxsRGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuY2xlYW51cFNlcnZlclRhc2ssIG51bGwpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmNsZWFudXBTZXJ2ZXJUYXNrLCAyMDApOwotCi0JCXRyeSB7Ci0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZGV0ZWN0aW5nUmVtb3ZlZFByb2plY3RzKTsKLQotCQkJLy8gVHJ5IHRvIHJlYWQgb2xkIHNlcnZlciBjb25maWd1cmF0aW9uCi0JCQlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzIiKTsKLQkJCUZpbGUgc2VydmVyRmlsZSA9IGNvbmZEaXIuYXBwZW5kKCJjb25mIikuYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCk7Ci0JCQlpZiAoc2VydmVyRmlsZS5leGlzdHMoKSkgewotCQkJCVNlcnZlciBvbGRTZXJ2ZXIgPSAoU2VydmVyKSBmYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZlckZpbGUpKTsKLQkJCQlTZXJ2ZXJJbnN0YW5jZSBvbGRJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShvbGRTZXJ2ZXIpOwotCQkJCQotCQkJCS8vIENvbGxlY3QgcGF0aHMgb2Ygb2xkIHdlYiBtb2R1bGVzIG1hbmFnZWQgYnkgV1RQCi0JCQkJU2V0IG9sZFBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlDb250ZXh0IFtdIGNvbnRleHRzID0gb2xkSW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gY29udGV4dHNbaV0uZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCXsKLQkJCQkJCQlvbGRQYXRocy5hZGQoY29udGV4dHNbaV0uZ2V0UGF0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFJlbW92ZSBwYXRocyBmb3Igd2ViIG1vZHVsZXMgdGhhdCBhcmUgc3RheWluZyBhcm91bmQKLQkJCQlMaXN0IG1vZHVsZXMgPSBnZXRXZWJNb2R1bGVzKCk7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQkJCW9sZFBhdGhzLnJlbW92ZShtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQotCQkJCS8vIERlbGV0ZSB3b3JrIGRpcmVjdG9yaWVzIGZvciBtYW5hZ2VkIHdlYiBtb2R1bGVzIHRoYXQgaGF2ZSBnb25lIGF3YXkKLQkJCQlpZiAob2xkUGF0aHMuc2l6ZSgpID4gMCApIHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKTsKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZXNUYXNrLCBvbGRQYXRocy5zaXplKCkgKiAxMDApOwotCQkJCQkKLQkJCQkJSXRlcmF0b3IgaXRlciA9IG9sZFBhdGhzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIG9sZFBhdGggPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCQkJCi0JCQkJCQkvLyBEZWxldGUgd29yayBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZW1vdmVkIGNvbnRleHQgaWYgaXQgaXMgd2l0aGluIGNvbmZEaXIuCi0JCQkJCQkvLyBJZiBpdCBpcyBvdXRzaWRlIG9mIGNvbmZEaXIsIGFzc3VtZSB1c2VyIGlzIGdvaW5nIHRvIG1hbmFnZSBpdC4KLQkJCQkJCUNvbnRleHQgY3R4ID0gb2xkSW5zdGFuY2UuZ2V0Q29udGV4dChvbGRQYXRoKTsKLQkJCQkJCUlQYXRoIGN0eFdvcmtQYXRoID0gb2xkSW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoY29uZkRpciwgY3R4KTsKLQkJCQkJCWlmIChjb25mRGlyLmlzUHJlZml4T2YoY3R4V29ya1BhdGgpKSB7Ci0JCQkJCQkJRmlsZSBjdHhXb3JrRGlyID0gY3R4V29ya1BhdGgudG9GaWxlKCk7Ci0JCQkJCQkJaWYgKGN0eFdvcmtEaXIuZXhpc3RzKCkgJiYgY3R4V29ya0Rpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQkJCUlTdGF0dXMgW10gcmVzdWx0cyA9IFB1Ymxpc2hIZWxwZXIuZGVsZXRlRGlyZWN0b3J5KGN0eFdvcmtEaXIsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQkJCQkJCQlpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZGVsZXRlIHdvcmsgZGlyZWN0b3J5ICIgKyBjdHhXb3JrRGlyLmdldFBhdGgoKSArICIgZm9yIHJlbW92ZWQgY29udGV4dCAiICsgb2xkUGF0aCk7Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQltcy5hZGQocmVzdWx0c1tpXSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJCX0KLQkJCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBFbHNlIG5vIHNlcnZlci54bWwuICBBc3N1bWUgZmlyc3QgcHVibGlzaCB0byBuZXcgdGVtcCBkaXJlY3RvcnkKLQkJCWVsc2UgewotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlNlcnZlciBjbGVhbmVkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY2xlYW51cCBzZXJ2ZXIgYXQgIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2xlYW51cFNlcnZlciwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQkJCi0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gbXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Zjc0OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgMzIgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDMySGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF8zMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmFwYWNoZS50b21jYXQuc3RhcnR1cC5Ub21jYXQiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgYWxsIGphcnMgZnJvbSB0aGUgVG9tY2F0IGxpYiBkaXJlY3RvcnkKLQkJRmlsZSBsaWJEaXIgPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpLnRvRmlsZSgpOwotCQlpZiAobGliRGlyLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmdbXSBsaWJzID0gbGliRGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaWJzW2ldLmVuZHNXaXRoKCJqYXIiKSkgewotCQkJCQlJUGF0aCBwYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKS5hcHBlbmQobGlic1tpXSk7Ci0JCQkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGgsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY29uZmlnUGF0aCAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZCgiLWYgXCIiICsgY29uZmlnUGF0aC5hcHBlbmQoImNvbmYiKS5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJfQotCQkKLQkJaWYgKCFzdGFydGluZykKLQkJCWxpc3QuYWRkKCItc3RvcCIpOwotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGgsIElQYXRoLCBJUGF0aCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoLCBib29sZWFuIGlzVGVzdEVudikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKCItRHRvbWNhdC5ob21lPVwiIiArIGluc3RhbGxQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQkvLyBJbmNsdWRlIGEgc3lzdGVtIHByb3BlcnR5IGZvciB0aGUgY29uZmlndXJhYmxlIGRlcGxveSBsb2NhdGlvbgotCQlsaXN0LmFkZCgiLUR3dHAuZGVwbG95PVwiIiArIGRlcGxveVBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCQotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgidG9tY2F0LnBvbGljeSIpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNjYW5BZGRNb2R1bGUoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5BZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJaWYgKCIyLjIiLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldFZlcnNpb24oKSkpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzMyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0U3RhbmRhcmRCYXNlRGlyZWN0b3J5KHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggY29uZkRpcikgewotCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiUHJlcGFyaW5nIHJ1bnRpbWUgZGlyZWN0b3J5Iik7Ci0JCS8vIFByZXBhcmUgaW5zdGFuY2UgZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0IGlzIHJlbGF0aXZlIHRvIHNlcnZlci54bWwKLQkJRmlsZSB0ZW1wID0gY29uZkRpci5hcHBlbmQoImNvbmYiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJ3ZWJhcHBzIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgid29yayIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoIGRlcGxveVBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlRGVwbG95bWVudERpcmVjdG9yeShkZXBsb3lQYXRoLAotCQkJCVRvbWNhdFZlcnNpb25IZWxwZXIuREVGQVVMVF9XRUJYTUxfU0VSVkxFVDIyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShJUGF0aCwgVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGggYmFzZURpciwgVG9tY2F0U2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTm9QdWJsaXNoTm90U3VwcG9ydGVkLCBudWxsKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFNoYXJlZExvYWRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZExvYWRlcihJUGF0aCBiYXNlRGlyKSB7Ci0JCS8vIE5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgZmFsc2Ugc2luY2UgVG9tY2F0IDMuMiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2Ugc2luY2UgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzRGVidWdBcmd1bWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEVuZG9yc2VkRGlyZWN0b3JpZXMoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwMDlkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVySW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIFRvbWNhdCB2NC4wIHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NDBDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIlRvbWNhdC1TdGFuZGFsb25lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NPTk5FQ1RPUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5odHRwLkh0dHBDb25uZWN0b3IiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9TT0NLRVRfRkFDVE9SWSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLm5ldC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NPTk5FQ1RPUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci50ZXN0Lkh0dHBDb25uZWN0b3IiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFKUF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5hanAudG9tY2F0NC5BanAxM0Nvbm5lY3RvciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSUF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3Iud2FycC5XYXJwQ29ubmVjdG9yIjsKLQotCXByb3RlY3RlZCBTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJJbnN0YW5jZSBzZXJ2ZXJJbnN0YW5jZTsKLQlwcm90ZWN0ZWQgRmFjdG9yeSBzZXJ2ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VydmVyRGlydHk7Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQotCS8qKgotCSAqIFRvbWNhdDQwQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NDBDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gUmV0dXJuIG9ubHkgYW4gSFRUUCBwb3J0IGZyb20gdGhlIHNlbGVjdGVkIFNlcnZpY2UKLQkJCWlmIChwb3J0LmdldE5hbWUoKS5lcXVhbHMoIkhUVFAgQ29ubmVjdG9yIikgJiYgcG9ydC5nZXRJZCgpLmluZGV4T2YoJy8nKSA8IDApCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJU3RyaW5nIGluc3RhbmNlU2VydmljZU5hbWUgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29ubmVjdG9yLmdldENsYXNzTmFtZSgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IE1lc3NhZ2VzLnBvcnRVbmtub3duOwotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSAiVENQSVAiOwotCQkJCQlib29sZWFuIGFkdmFuY2VkID0gdHJ1ZTsKLQkJCQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gbnVsbDsKLQkJCQkJaW50IHBvcnQgPSAtMTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbm5lY3Rvci5nZXRQb3J0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJaWYgKEhUVFBfQ09OTkVDVE9SLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCQluYW1lID0gIkhUVFAgQ29ubmVjdG9yIjsKLQkJCQkJCXByb3RvY29sID0gIkhUVFAiOwotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJCS8vIGNoZWNrIGZvciBTU0wgY29ubmVjdG9yCi0JCQkJCQl0cnkgewotCQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IGNvbm5lY3Rvci5nZXRTdWJFbGVtZW50KCJGYWN0b3J5Iik7Ci0JCQkJCQkJaWYgKFNTTF9TT0NLRVRfRkFDVE9SWS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSkgewotCQkJCQkJCQluYW1lID0gIlNTTCBDb25uZWN0b3IiOwotCQkJCQkJCQlwcm90b2NvbCA9ICJTU0wiOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQlpZiAoIkhUVFAiLmVxdWFscyhwcm90b2NvbCkpCi0JCQkJCQkJYWR2YW5jZWQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIGlmIChBSlBfQ09OTkVDVE9SLmVxdWFscyhjbGFzc05hbWUpKQotCQkJCQkJbmFtZSA9ICJBSlAgQ29ubmVjdG9yIjsKLQkJCQkJZWxzZSBpZiAoV0FSUF9DT05ORUNUT1IuZXF1YWxzKGNsYXNzTmFtZSkpCi0JCQkJCQluYW1lID0gIldhcnAgQ29ubmVjdG9yIjsKLQkJCQkJU3RyaW5nIHBvcnRJZDsKLQkJCQkJaWYgKGluc3RhbmNlU2VydmljZU5hbWUgIT0gbnVsbCAmJiBpbnN0YW5jZVNlcnZpY2VOYW1lLmVxdWFscyhzZXJ2aWNlLmdldE5hbWUoKSkpCi0JCQkJCQlwb3J0SWQgPSBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCQllbHNlCi0JCQkJCQlwb3J0SWQgPSBpICsiLyIgKyBqOwotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLQkJCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChwb3J0SWQsIG5hbWUsIHBvcnQsIHByb3RvY29sLCBjb250ZW50VHlwZXMsIGFkdmFuY2VkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBzZXJ2ZXIgcG9ydHMiLCBlKTsKLQkJfQotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQlpZiAocmVsb2FkID09IG51bGwpCi0JCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQljb250ZXh0LmdldERvY0Jhc2UoKSwgY29udGV4dC5nZXRTb3VyY2UoKSwKLQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgbW9kdWxlcyIsIGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCkgewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0SG9zdFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQobW9kdWxlLmdldFBhdGgoKSk7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIGNvbnRleHQpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2ltcG9ydEZyb21QYXRoKElQYXRoLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQl3aGlsZSAoc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dCgwKSkgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDUpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9GaWxlKCkpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NC4wIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA4MDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHdlYi54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOwotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQoZmlsZSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB0b21jYXQtdXNlcnMueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wb2xpY3kKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjQuMCBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSBib29sZWFuCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBib29sZWFuIGZvcmNlRGlydHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgMyk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gc2F2ZSBmaWxlcwotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNTZXJ2ZXJEaXJ0eSkgewotCQkJCXNlcnZlckZhY3Rvcnkuc2F2ZShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUocGF0aC5hcHBlbmQoIndlYi54bWwiKS50b09TU3RyaW5nKCksIGZvcmNlRGlydHkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4wIGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LiAgQWxsIGZpbGVzIGFyZSBmb3JjZWQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGggZGVzaW5hdGlvbiBwYXRoIGZvciB0aGUgZmlsZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzYXZlKHBhdGgsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wb2xpY3kKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeUZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY0LjAgY29uZmlndXJhdGlvbiB0byAiICsgZm9sZGVyLnRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuY3JlYXRlQ29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoInNlcnZlciIuZXF1YWxzKGlkKSkgewotCQkJCXNlcnZlci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJaW50IGkgPSBpZC5pbmRleE9mKCIvIik7Ci0JCQkvLyBJZiBhIGNvbm5lY3RvciBpbiB0aGUgaW5zdGFuY2UgU2VydmljZQotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWlmIChjb25uZWN0b3IgIT0gbnVsbCkgewotCQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRWxzZSBhIGNvbm5lY3RvciBpbiBhbm90aGVyIFNlcnZpY2UKLQkJCWVsc2UgewotCQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoaSArIDEpKTsKLQkJCQkKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyBzZXJ2ZXIgcG9ydCAiICsgaWQsIGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyBhIG1pbWUgbWFwcGluZy4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7Ci0JCXdlYkFwcERvY3VtZW50LnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KGluZGV4KTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcmVmICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhbnVwIHRoZSBzZXJ2ZXIgaW5zdGFuY2UuICBUaGlzIGNvbnNpc3RzIG9mIGRlbGV0aW5nIHRoZSB3b3JrCi0JICogZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBDb250ZXh0cyB0aGF0IGFyZSBnb2luZyBhd2F5IGluIHRoZQotCSAqIHVwIGNvbWluZyBwdWJsaXNoLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbmNlIGRpcmVjdG9yeSwgaS5lLiBjYXRhbGluYS5iYXNlCi0JICogQHBhcmFtIGluc3RhbGxEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAobm90IGN1cnJlbnRseSB1c2VkKQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiBNdWx0aVN0YXR1cyBjb250YWluaW5nIHJlc3VsdHMgb2YgdGhlIGNsZWFudXAgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgY2xlYW51cFNlcnZlcihJUGF0aCBiYXNlRGlyLCBJUGF0aCBpbnN0YWxsRGlyLCBib29sZWFuIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IG1vZHVsZXMgPSBnZXRXZWJNb2R1bGVzKCk7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNsZWFudXBDYXRhbGluYVNlcnZlcihiYXNlRGlyLCBpbnN0YWxsRGlyLCByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBtb2R1bGVzLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoLCBJUGF0aCwgVG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5sb2NhbGl6ZUNvbmZpZ3VyYXRpb24oYmFzZURpciwgZGVwbG95RGlyLCB0b21jYXRTZXJ2ZXIsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGFiODEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNDAgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDQwSGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aFdpdGhGb2xkZXJDaGVjayhpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF80MCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gNC4wIC0gYWRkIGJvb3RzdHJhcC5qYXIgZnJvbSB0aGUgVG9tY2F0IGJpbiBkaXJlY3RvcnkKLQkJSVBhdGggYmluUGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgiYmluIik7Ci0JCWlmIChiaW5QYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlJUGF0aCBwYXRoID0gYmluUGF0aC5hcHBlbmQoImJvb3RzdHJhcC5qYXIiKTsKLQkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWlmIChkZWJ1ZykKLQkJCWxpc3QuYWRkKCItZGVidWciKTsKLQkJCi0JCWlmIChzdGFydGluZykKLQkJCWxpc3QuYWRkKCJzdGFydCIpOwotCQllbHNlCi0JCQlsaXN0LmFkZCgic3RvcCIpOwotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCWlmICghZGVidWcpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nIFtdIHsgIi1kZWJ1ZyIgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoaXNUZXN0RW52KQotCQkJbGlzdC5hZGQoIi1EY2F0YWxpbmEuYmFzZT1cIiIgKyBjb25maWdQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQllbHNlIAotCQkJbGlzdC5hZGQoIi1EY2F0YWxpbmEuYmFzZT1cIiIgKyBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJbGlzdC5hZGQoIi1EY2F0YWxpbmEuaG9tZT1cIiIgKyBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJLy8gSW5jbHVkZSBhIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBkZXBsb3kgbG9jYXRpb24KLQkJbGlzdC5hZGQoIi1Ed3RwLmRlcGxveT1cIiIgKyBkZXBsb3lQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQlsaXN0LmFkZCgiLURqYXZhLmVuZG9yc2VkLmRpcnM9XCIiICsgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhpbnN0YWxsUGF0aCkgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM0MCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldFN0YW5kYXJkQmFzZURpcmVjdG9yeShzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoIGJhc2VEaXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlQ2F0YWxpbmFJbnN0YW5jZURpcmVjdG9yeShiYXNlRGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGggZGVwbG95UGF0aCkgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVEZXBsb3ltZW50RGlyZWN0b3J5KGRlcGxveVBhdGgsCi0JCQkJVG9tY2F0VmVyc2lvbkhlbHBlci5ERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGgsIFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlci5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUHVibGlzaE5vdFN1cHBvcnRlZCwgbnVsbCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0JCi0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0U2hhcmVkTG9hZGVyKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkTG9hZGVyKElQYXRoIGJhc2VEaXIpIHsKLQkJLy8gTm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBmYWxzZSBzaW5jZSBUb21jYXQgNC4wIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiBmYWxzZSBzaW5jZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlYnVnQXJndW1lbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGguYXBwZW5kKCJiaW4iKS50b09TU3RyaW5nKCkgKyAKLQkJamF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3IgKwotCQlpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgibGliIikudG9PU1N0cmluZygpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDFDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBlYmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDFDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLS8qKgotICogVG9tY2F0IHY0LjEgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ0MUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUb21jYXRDb25maWd1cmF0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0UgPSAiVG9tY2F0LVN0YW5kYWxvbmUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDQuQ295b3RlQ29ubmVjdG9yIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKS19QUk9UT0NPTF9IQU5ETEVSID0gIm9yZy5hcGFjaGUuamsuc2VydmVyLkprQ295b3RlSGFuZGxlciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX1NPQ0tFVF9GQUNUT1JZID0gIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDQuQ295b3RlU2VydmVyU29ja2V0RmFjdG9yeSI7Ci0JLy9wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NPTk5FQ1RPUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci50ZXN0Lkh0dHBDb25uZWN0b3IiOwotCS8vb3JnLmFwYWNoZS5hanAudG9tY2F0NC5BanAxM0Nvbm5lY3RvcgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQQUNIRV9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3Iud2FycC5XYXJwQ29ubmVjdG9yIjsKLQotCXByb3RlY3RlZCBTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJJbnN0YW5jZSBzZXJ2ZXJJbnN0YW5jZTsKLQlwcm90ZWN0ZWQgRmFjdG9yeSBzZXJ2ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VydmVyRGlydHk7Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQotCS8qKgotCSAqIFRvbWNhdDQxQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NDFDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gUmV0dXJuIG9ubHkgYW4gSFRUUCBwb3J0IGZyb20gdGhlIHNlbGVjdGVkIFNlcnZpY2UKLQkJCWlmIChwb3J0LmdldE5hbWUoKS5lcXVhbHMoIkhUVFAgQ29ubmVjdG9yIikgJiYgcG9ydC5nZXRJZCgpLmluZGV4T2YoJy8nKSA8IDApCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJU3RyaW5nIGluc3RhbmNlU2VydmljZU5hbWUgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29ubmVjdG9yLmdldENsYXNzTmFtZSgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IGNsYXNzTmFtZTsKLQkJCQkJU3RyaW5nIHByb3RvY29sID0gIlRDUElQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChjb25uZWN0b3IuZ2V0UG9ydCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCWlmIChIVFRQX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQkJbmFtZSA9ICJIVFRQIENvbm5lY3RvciI7Ci0JCQkJCQlwcm90b2NvbCA9ICJIVFRQIjsKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCQkvLyBjaGVjayBmb3IgQUpQLzEuMyBDb3lvdGUgY29ubmVjdG9yCi0JCQkJCQlTdHJpbmcgcHJvdG9jb2xIYW5kbGVyID0gY29ubmVjdG9yLmdldFByb3RvY29sSGFuZGxlckNsYXNzTmFtZSgpOwotCQkJCQkJaWYgKEpLX1BST1RPQ09MX0hBTkRMRVIuZXF1YWxzKHByb3RvY29sSGFuZGxlcikpIHsKLQkJCQkJCQluYW1lID0gIkFKUC8xLjMgQ29ubmVjdG9yIjsKLQkJCQkJCQlwcm90b2NvbCA9ICJBSlAvMS4zIjsgCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGFzc3VtZSBIVFRQLCBjaGVjayBmb3IgSFRUUCBTU0wgY29ubmVjdG9yCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRWxlbWVudCBlbGVtZW50ID0gY29ubmVjdG9yLmdldFN1YkVsZW1lbnQoIkZhY3RvcnkiKTsKLQkJCQkJCQkJaWYgKFNTTF9TT0NLRVRfRkFDVE9SWS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSkgewotCQkJCQkJCQkJbmFtZSA9ICJTU0wgQ29ubmVjdG9yIjsKLQkJCQkJCQkJCXByb3RvY29sID0gIlNTTCI7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIkhUVFAiLmVxdWFscyhwcm90b2NvbCkpCi0JCQkJCQkJYWR2YW5jZWQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIGlmIChBUEFDSEVfQ09OTkVDVE9SLmVxdWFscyhjbGFzc05hbWUpKQotCQkJCQkJbmFtZSA9ICJBcGFjaGUgQ29ubmVjdG9yIjsKLQkJCQkJU3RyaW5nIHBvcnRJZDsKLQkJCQkJaWYgKGluc3RhbmNlU2VydmljZU5hbWUgIT0gbnVsbCAmJiBpbnN0YW5jZVNlcnZpY2VOYW1lLmVxdWFscyhzZXJ2aWNlLmdldE5hbWUoKSkpCi0JCQkJCQlwb3J0SWQgPSBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCQllbHNlCi0JCQkJCQlwb3J0SWQgPSBpICsiLyIgKyBqOwotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLQkJCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChwb3J0SWQsIG5hbWUsIHBvcnQsIHByb3RvY29sLCBjb250ZW50VHlwZXMsIGFkdmFuY2VkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBzZXJ2ZXIgcG9ydHMiLCBlKTsKLQkJfQotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQlpZiAocmVsb2FkID09IG51bGwpCi0JCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQljb250ZXh0LmdldERvY0Jhc2UoKSwgY29udGV4dC5nZXRTb3VyY2UoKSwKLQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRIb3N0V29ya0RpcmVjdG9yeShiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoLCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlUGF0aCwgY29udGV4dCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jaW1wb3J0RnJvbVBhdGgoSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCXdoaWxlIChzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KDApKSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDUpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChwYXRoLmFwcGVuZCgid2ViLnhtbCIpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJCS8vIGxvYWQgcG9saWN5IGZpbGUKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY0LjAgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDgwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0KLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVsb2FkIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGZvcmNlRGlydHkgYm9vbGVhbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoSVBhdGggcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDMpOwotCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy8gc2F2ZSBmaWxlcwotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNTZXJ2ZXJEaXJ0eSkgewotCQkJCXNlcnZlckZhY3Rvcnkuc2F2ZShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUocGF0aC5hcHBlbmQoIndlYi54bWwiKS50b09TU3RyaW5nKCksIGZvcmNlRGlydHkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LiAgQWxsIGZpbGVzIGFyZSBmb3JjZWQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGggZGVzaW5hdGlvbiBwYXRoIGZvciB0aGUgZmlsZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzYXZlKHBhdGgsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wb2xpY3kKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeUZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY0LjEgY29uZmlndXJhdGlvbiB0byAiICsgZm9sZGVyLnRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc01EQkxpc3RlbmVyKFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IGNvdW50ID0gc2VydmVyLmdldExpc3RlbmVyQ291bnQoKTsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IHNlcnZlci5nZXRMaXN0ZW5lcihpKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkuaW5kZXhPZigibWJlYW4iKSA+PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuY3JlYXRlQ29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoInNlcnZlciIuZXF1YWxzKGlkKSkgewotCQkJCXNlcnZlci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJaW50IGkgPSBpZC5pbmRleE9mKCIvIik7Ci0JCQkvLyBJZiBhIGNvbm5lY3RvciBpbiB0aGUgaW5zdGFuY2UgU2VydmljZQotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWlmIChjb25uZWN0b3IgIT0gbnVsbCkgewotCQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRWxzZSBhIGNvbm5lY3RvciBpbiBhbm90aGVyIFNlcnZpY2UKLQkJCWVsc2UgewotCQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoaSArIDEpKTsKLQkJCQkKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyBzZXJ2ZXIgcG9ydCAiICsgaWQsIGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbWltZSBtYXBwaW5nLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJd2ViQXBwRG9jdW1lbnQucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfTUFQUElOR19QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlcwotCSAqIHByZXNlbnQgaW4gcHJvamVjdHMgdG8gcHVibGlzaGVkIHNlcnZlci54bWwuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGVwbG95RGlyIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnB1Ymxpc2hDYXRhbGluYUNvbnRleHRDb25maWcoYmFzZURpciwgZGVwbG95RGlyLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW51cCB0aGUgc2VydmVyIGluc3RhbmNlLiAgVGhpcyBjb25zaXN0cyBvZiBkZWxldGluZyB0aGUgd29yawotCSAqIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggQ29udGV4dHMgdGhhdCBhcmUgZ29pbmcgYXdheSBpbiB0aGUKLQkgKiB1cCBjb21pbmcgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnksIGkuZS4gY2F0YWxpbmEuYmFzZQotCSAqIEBwYXJhbSBpbnN0YWxsRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKG5vdCBjdXJyZW50bHkgdXNlZCkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gTXVsdGlTdGF0dXMgY29udGFpbmluZyByZXN1bHRzIG9mIHRoZSBjbGVhbnVwIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggYmFzZURpciwgSVBhdGggaW5zdGFsbERpciwgYm9vbGVhbiByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jbGVhbnVwQ2F0YWxpbmFTZXJ2ZXIoYmFzZURpciwgaW5zdGFsbERpciwgcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgbW9kdWxlcywgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCwgSVBhdGgsIFRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgdG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIubG9jYWxpemVDb25maWd1cmF0aW9uKGJhc2VEaXIsIGRlcGxveURpciwgdG9tY2F0U2VydmVyLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhM2RiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDQxIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ0MUhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGhXaXRoRm9sZGVyQ2hlY2soaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNDEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIDQuMSAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5Ci0JCUlQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpOwotCQlpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7Ci0JCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZGVidWcpCi0JCQlsaXN0LmFkZCgiLWRlYnVnIik7Ci0JCQotCQlpZiAoc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgic3RhcnQiKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoInN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHRlbXApOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlpZiAoIWRlYnVnKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7ICItZGVidWciIH07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIElQYXRoIGRlcGxveVBhdGgsIGJvb2xlYW4gaXNUZXN0RW52KSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldENhdGFsaW5hVk1Bcmd1bWVudHMoaW5zdGFsbFBhdGgsIGNvbmZpZ1BhdGgsIGRlcGxveVBhdGgsIGdldEVuZG9yc2VkRGlyZWN0b3JpZXMoaW5zdGFsbFBhdGgpLCBpc1Rlc3RFbnYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGggY29uZmlnUGF0aCkgewotCQlyZXR1cm4gY29uZmlnUGF0aC5hcHBlbmQoImNvbmYiKS5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNjYW5BZGRNb2R1bGUoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5BZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJU3RyaW5nIHZlcnNpb24gPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldFZlcnNpb24oKTsKLQkJaWYgKCIyLjIiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi4zIi5lcXVhbHModmVyc2lvbikpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzQxLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0U3RhbmRhcmRCYXNlRGlyZWN0b3J5KHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggYmFzZURpcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVDYXRhbGluYUluc3RhbmNlRGlyZWN0b3J5KGJhc2VEaXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZURlcGxveW1lbnREaXJlY3RvcnkoZGVwbG95UGF0aCwKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLkRFRkFVTFRfV0VCWE1MX1NFUlZMRVQyMyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGgsIFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlci5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUHVibGlzaE5vdFN1cHBvcnRlZCwgbnVsbCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0JCi0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0U2hhcmVkTG9hZGVyKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkTG9hZGVyKElQYXRoIGJhc2VEaXIpIHsKLQkJLy8gTm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBmYWxzZSBzaW5jZSBUb21jYXQgNC4xIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiBmYWxzZSBzaW5jZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlYnVnQXJndW1lbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdoaWxlIFRvbWNhdCA0LjEueCBkb2VzIGltcGxlbWVudCBhIGZvcm0gb2Ygc2VwYXJhdGUKLQkgKiBjb250ZXh0IGZpbGVzLCB0aGVzZSBmaWxlIGFyZSBmb3VuZCBvdXRzaWRlIG9mIHRoZQotCSAqICZxdW90O2NvbmYmcXVvdDsgZGlyZWN0b3J5IGFuZCBpcyBub3QgcHJhY3RpY2FsIHRvCi0JICogc3VwcG9ydC4KLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEVuZG9yc2VkRGlyZWN0b3JpZXMoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgiZW5kb3JzZWQiKS50b09TU3RyaW5nKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg4MjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIFRvbWNhdCB2NS4wIHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NTBDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIkNhdGFsaW5hIjsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnRpZXNGaWxlOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIHByb3RvY29sSGFuZGxlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMVByb3RvY29sIiwgIkhUVFAvMS4xIik7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuamsuc2VydmVyLkprQ295b3RlSGFuZGxlciIsICJBSlAvMS4zIik7Ci0JfQotCQotCS8qKgotCSAqIFRvbWNhdDUwQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NTBDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gUmV0dXJuIG9ubHkgYW4gSFRUUCBwb3J0IGZyb20gdGhlIHNlbGVjdGVkIFNlcnZpY2UKLQkJCWlmIChwb3J0LmdldFByb3RvY29sKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSAmJiBwb3J0LmdldElkKCkuaW5kZXhPZignLycpIDwgMCkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSBtYXBwaW5ncy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gd2ViQXBwRG9jdW1lbnQuZ2V0TWltZU1hcHBpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgU2VydmVyUG9ydHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gdXNlcy4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJLy8gZmlyc3QgYWRkIHNlcnZlciBwb3J0Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoc2VydmVyLmdldFBvcnQoKSk7Ci0JCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQoInNlcnZlciIsIE1lc3NhZ2VzLnBvcnRTZXJ2ZXIsIHBvcnQsICJUQ1BJUCIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCS8vIGFkZCBjb25uZWN0b3JzCi0JCXRyeSB7Ci0JCQlTdHJpbmcgaW5zdGFuY2VTZXJ2aWNlTmFtZSA9IHNlcnZlckluc3RhbmNlLmdldFNlcnZpY2UoKS5nZXROYW1lKCk7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaW50IHNpemUyID0gc2VydmljZS5nZXRDb25uZWN0b3JDb3VudCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3Ioaik7Ci0JCQkJCVN0cmluZyBuYW1lID0gIkhUVFAvMS4xIjsKLQkJCQkJU3RyaW5nIHByb3RvY29sMiA9ICJIVFRQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChjb25uZWN0b3IuZ2V0UG9ydCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCVN0cmluZyBwcm90b2NvbCA9IGNvbm5lY3Rvci5nZXRQcm90b2NvbCgpOwotCQkJCQlpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWlmIChwcm90b2NvbC5zdGFydHNXaXRoKCJIVFRQIikpIHsKLQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwcm90b2NvbC5zdGFydHNXaXRoKCJBSlAiKSkgewotCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCQlwcm90b2NvbDIgPSAiQUpQIjsgCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBHZXQgVG9tY2F0IGVxdWl2YWxlbnQgbmFtZSBpZiBwcm90b2NvbCBoYW5kbGVyIGNsYXNzIHNwZWNpZmllZAotCQkJCQkJCW5hbWUgPSAoU3RyaW5nKXByb3RvY29sSGFuZGxlck1hcC5nZXQocHJvdG9jb2wpOwotCQkJCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gUHJlcGFyZSBzaW1wbGUgcHJvdG9jb2wgc3RyaW5nIGZvciBTZXJ2ZXJQb3J0IHByb3RvY29sCi0JCQkJCQkJCWludCBpbmRleCA9IG5hbWUuaW5kZXhPZignLycpOwotCQkJCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCQkJcHJvdG9jb2wyID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlwcm90b2NvbDIgPSBuYW1lOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBTcGVjaWZpZWQgcHJvdG9jb2wgaXMgdW5rbm93biwganVzdCB1c2UgYXMgaXMKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJCQlwcm90b2NvbDIgPSBwcm90b2NvbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHByb3RvY29sMi50b0xvd2VyQ2FzZSgpLmVxdWFscygiaHR0cCIpKQotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJU3RyaW5nIHNlY3VyZSA9IGNvbm5lY3Rvci5nZXRTZWN1cmUoKTsKLQkJCQkJaWYgKHNlY3VyZSAhPSBudWxsICYmIHNlY3VyZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW5hbWUgPSAiU1NMIjsKLQkJCQkJCXByb3RvY29sMiA9ICJTU0wiOwotCQkJCQl9IGVsc2UKLQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBwb3J0SWQ7Ci0JCQkJCWlmIChpbnN0YW5jZVNlcnZpY2VOYW1lICE9IG51bGwgJiYgaW5zdGFuY2VTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZS5nZXROYW1lKCkpKQotCQkJCQkJcG9ydElkID0gSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9ydElkID0gaSArIi8iICsgajsKLQkJCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KHBvcnRJZCwgbmFtZSwgcG9ydCwgcHJvdG9jb2wyLCBjb250ZW50VHlwZXMsIGFkdmFuY2VkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBzZXJ2ZXIgcG9ydHMiLCBlKTsKLQkJfQotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQlpZiAocmVsb2FkID09IG51bGwpCi0JCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQljb250ZXh0LmdldERvY0Jhc2UoKSwgY29udGV4dC5nZXRTb3VyY2UoKSwKLQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgpIHsKLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldEhvc3RXb3JrRGlyZWN0b3J5KGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGgsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIElQYXRoIGdldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoLCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQlpZiAoY29udGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldENvbnRleHRXb3JrRGlyZWN0b3J5KGJhc2VQYXRoLCBjb250ZXh0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgNik7Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY1LjAgY29uZmlnCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKTsKLQkJCWluLnJlYWQoKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KHBhdGguYXBwZW5kKCJ3ZWIueG1sIikpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9GaWxlKCkpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJLy8gbG9hZCBwcm9wZXJ0aWVzIGZpbGUKLQkJCUZpbGUgZmlsZSA9IHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJZWxzZQotCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY1LjAgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jaW1wb3J0RnJvbVBhdGgoSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCXdoaWxlIChzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KDApKSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElGb2xkZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgMTAwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0KLQkJCS8vIGxvYWQgY2F0YWxpbmEucHJvcGVydGllcwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wcm9wZXJ0aWVzIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCXByb3BlcnRpZXNGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMoaW4pOwotCQkJfQotCQkJZWxzZQotCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW5jZWxsZWQiKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZWxvYWQgVG9tY2F0IHY1LjAgY29uZmlndXJhdGlvbiBmcm9tOiAiICsgZm9sZGVyLmdldEZ1bGxQYXRoKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSBib29sZWFuCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBib29sZWFuIGZvcmNlRGlydHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgNCk7Ci0JCi0JCQkvLyBtYWtlIHN1cmUgZGlyZWN0b3J5IGV4aXN0cwotCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJZm9yY2VEaXJ0eSA9IHRydWU7Ci0JCQkJcGF0aC50b0ZpbGUoKS5ta2RpcigpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpIHsKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9PU1N0cmluZygpLCBmb3JjZURpcnR5KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b09TU3RyaW5nKCksIHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwgJiYgZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIEFsbCBmaWxlcyBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGRlc2luYXRpb24gcGF0aCBmb3IgdGhlIGZpbGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAxMTAwKTsKLQkJCQotCQkJLy8gc2F2ZSBzZXJ2ZXIueG1sCi0JCQlieXRlW10gZGF0YSA9IHNlcnZlckZhY3RvcnkuZ2V0Q29udGVudHMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChpc1NlcnZlckRpcnR5KQotCQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSB0b21jYXQtdXNlcnMueG1sCi0JCQlkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyh0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIGNhdGFsaW5hLnBvbGljeQotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9saWN5RmlsZS5nZXRCeXRlcygpKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZSAhPSBudWxsKSB7Ci0JCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wcm9wZXJ0aWVzIik7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQl9IGVsc2UKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzTURCTGlzdGVuZXIoU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgY291bnQgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXJDb3VudCgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gc2VydmVyLmdldExpc3RlbmVyKGkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKS5pbmRleE9mKCJtYmVhbiIpID49IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5jcmVhdGVDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldERvY0Jhc2UobW9kdWxlLmdldERvY3VtZW50QmFzZSgpKTsKLQkJCQljb250ZXh0LnNldFBhdGgobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQkJCWNvbnRleHQuc2V0U291cmNlKG1vZHVsZS5nZXRNZW1lbnRvKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBtb2R1bGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIHdlYiBtb2R1bGUgIiArIG1vZHVsZS5nZXRQYXRoKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBleHRlbnNpb24gb2YgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQl0cnkgewotCQkJaWYgKCJzZXJ2ZXIiLmVxdWFscyhpZCkpIHsKLQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCWludCBpID0gaWQuaW5kZXhPZigiLyIpOwotCQkJLy8gSWYgYSBjb25uZWN0b3IgaW4gdGhlIGluc3RhbmNlIFNlcnZpY2UKLQkJCWlmIChpIDwgMCkgewotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZlckluc3RhbmNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQlpZiAoY29ubmVjdG9yICE9IG51bGwpIHsKLQkJCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEVsc2UgYSBjb25uZWN0b3IgaW4gYW5vdGhlciBTZXJ2aWNlCi0JCQllbHNlIHsKLQkJCQlpbnQgc2Vydk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKGkgKyAxKSk7Ci0JCQkJCi0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2Uoc2Vydk51bSk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyBzZXJ2ZXIgcG9ydCAiICsgaWQsIGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbWltZSBtYXBwaW5nLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJd2ViQXBwRG9jdW1lbnQucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfTUFQUElOR19QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlcwotCSAqIHByZXNlbnQgaW4gcHJvamVjdHMgdG8gcHVibGlzaGVkIHNlcnZlci54bWwuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGVwbG95RGlyIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnB1Ymxpc2hDYXRhbGluYUNvbnRleHRDb25maWcoYmFzZURpciwgZGVwbG95RGlyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29udGV4dHMgaW4gc2VydmVyLnhtbCB0byBzZXJ2ZSBwcm9qZWN0cyBkaXJlY3RseSB3aXRob3V0Ci0JICogcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIGNhdGFsaW5hIGluc3RhbmNlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiByZXN1bHQgb2Ygb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdXBkYXRlQ29udGV4dHNUb1NlcnZlRGlyZWN0bHkoSVBhdGggYmFzZURpciwgU3RyaW5nIGxvYWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KGJhc2VEaXIsIGxvYWRlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW51cCB0aGUgc2VydmVyIGluc3RhbmNlLiAgVGhpcyBjb25zaXN0cyBvZiBkZWxldGluZyB0aGUgd29yawotCSAqIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggQ29udGV4dHMgdGhhdCBhcmUgZ29pbmcgYXdheSBpbiB0aGUKLQkgKiB1cCBjb21pbmcgcHVibGlzaC4gIEluIGFkZGl0aW9uLCBDb250ZXh0IFhNTCBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuCi0JICogY3JlYXRlZCBmb3IgdGhlc2UgQ29udGV4dHMgYXJlIGFsc28gZGVsZXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnksIGkuZS4gY2F0YWxpbmEuYmFzZQotCSAqIEBwYXJhbSBpbnN0YWxsRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKG5vdCBjdXJyZW50bHkgdXNlZCkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gTXVsdGlTdGF0dXMgY29udGFpbmluZyByZXN1bHRzIG9mIHRoZSBjbGVhbnVwIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggYmFzZURpciwgSVBhdGggaW5zdGFsbERpciwgYm9vbGVhbiByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jbGVhbnVwQ2F0YWxpbmFTZXJ2ZXIoYmFzZURpciwgaW5zdGFsbERpciwgZmFsc2UsIG1vZHVsZXMsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGgsIElQYXRoLCBUb21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmxvY2FsaXplQ29uZmlndXJhdGlvbihiYXNlRGlyLCBkZXBsb3lEaXIsIHRvbWNhdFNlcnZlciwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1MEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTg0ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1MEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIFRvbWNhdCA1MCBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NTBIYW5kbGVyIGltcGxlbWVudHMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciN2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gVG9tY2F0UGx1Z2luLnZlcmlmeUluc3RhbGxQYXRoV2l0aEZvbGRlckNoZWNrKGluc3RhbGxQYXRoLCBUb21jYXRQbHVnaW4uVE9NQ0FUXzUwKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCUxpc3QgY3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyA1LjAgLSBhZGQgYm9vdHN0cmFwLmphciBmcm9tIHRoZSBUb21jYXQgYmluIGRpcmVjdG9yeQotCQlJUGF0aCBiaW5QYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJiaW4iKTsKLQkJaWYgKGJpblBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCUlQYXRoIHBhdGggPSBiaW5QYXRoLmFwcGVuZCgiYm9vdHN0cmFwLmphciIpOwotCQkJY3AuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGgsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYgKGRlYnVnKQotCQkJbGlzdC5hZGQoIi1kZWJ1ZyIpOwotCQkKLQkJaWYgKHN0YXJ0aW5nKQotCQkJbGlzdC5hZGQoInN0YXJ0Iik7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKCJzdG9wIik7Ci0JCQotCQlTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh0ZW1wKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJaWYgKCFkZWJ1ZykgewotCQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAiLWRlYnVnIiB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGgsIElQYXRoLCBJUGF0aCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoLCBib29sZWFuIGlzVGVzdEVudikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRDYXRhbGluYVZNQXJndW1lbnRzKGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoLCBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKGluc3RhbGxQYXRoKSwgaXNUZXN0RW52KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjQiLmVxdWFscyh2ZXJzaW9uKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTcGVjNTAsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRTdGFuZGFyZEJhc2VEaXJlY3Rvcnkoc2VydmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCBiYXNlRGlyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZUNhdGFsaW5hSW5zdGFuY2VEaXJlY3RvcnkoYmFzZURpcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoIGRlcGxveVBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlRGVwbG95bWVudERpcmVjdG9yeShkZXBsb3lQYXRoLAotCQkJCVRvbWNhdFZlcnNpb25IZWxwZXIuREVGQVVMVF9XRUJYTUxfU0VSVkxFVDI0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShJUGF0aCwgVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGggYmFzZURpciwgVG9tY2F0U2VydmVyIHNlcnZlcikgewotCQlJU3RhdHVzIHN0YXR1czsKLQkJLy8gSWYgc2VydmluZyBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZywgbG9hZGVyIGphciBpcyBuZWVkZWQKLQkJaWYgKHNlcnZlci5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCXN0YXR1cyA9IFRvbWNhdFZlcnNpb25IZWxwZXIuY29weUxvYWRlckphcigKLQkJCQkJZ2V0UnVudGltZUJhc2VEaXJlY3Rvcnkoc2VydmVyKS5hcHBlbmQoInNlcnZlci9saWIiKSwKLQkJCQkJc2VydmVyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJLy8gSWYgY29weSBzdWNjZXNzZnVsIGFuZCBydW5uaW5nIGEgc2VwYXJhdGUgc2VydmVyIGluc3RhbmNlLCBtb2RpZnkgY2F0YWxpbmEucHJvcGVydGllcwotCQkJaWYgKHN0YXR1cy5pc09LKCkgJiYgc2VydmVyLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCQlzdGF0dXMgPSBUb21jYXRWZXJzaW9uSGVscGVyLnVwZGF0ZVByb3BlcnRpZXNUb1NlcnZlRGlyZWN0bHkoYmFzZURpciwgInNlcnZlci9saWIiLCAic2VydmVyIik7Ci0JCQl9Ci0JCX0KLQkJLy8gRWxzZSBlbnN1cmUgamFyIGlzIHJlbW92ZWQKLQkJZWxzZSB7Ci0JCQlUb21jYXRWZXJzaW9uSGVscGVyLnJlbW92ZUxvYWRlckphcigKLQkJCQkJZ2V0UnVudGltZUJhc2VEaXJlY3Rvcnkoc2VydmVyKS5hcHBlbmQoInNlcnZlci9saWIiKSwKLQkJCQkJc2VydmVyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJLy8gVE9ETyBEZWNpZGUgd2hhdCB0byBkbyB3aXRoIHJlbW92YWwgd2FybmluZywgbWF5YmUgbm90aGluZwotCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRTaGFyZWRMb2FkZXIoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFyZWRMb2FkZXIoSVBhdGggYmFzZURpcikgewotCQkvLyBVc2Ugc2hhcmVkIGxvYWRlcgotCQlyZXR1cm4gInNoYXJlZCI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBzaW5jZSBUb21jYXQgNS54IHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgc2luY2UgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c0RlYnVnQXJndW1lbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVidWdBcmd1bWVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEVuZG9yc2VkRGlyZWN0b3JpZXMoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgiZW5kb3JzZWQiKS50b09TU3RyaW5nKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTVDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmIyNjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIFRvbWNhdCB2NS41IHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NTVDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIkNhdGFsaW5hIjsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IGNvbnRleHREb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCB0b21jYXRVc2Vyc0RvY3VtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBwb2xpY3lGaWxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9wZXJ0aWVzRmlsZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIHByb3RvY29sSGFuZGxlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMVByb3RvY29sIiwgIkhUVFAvMS4xIik7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFBcHJQcm90b2NvbCIsICJIVFRQLzEuMSIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmNveW90ZS5hanAuQWpwQXByUHJvdG9jb2wiLCAiQUpQLzEuMyIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiLCAiQUpQLzEuMyIpOwotCX0KLQkKLQkvKioKLQkgKiBUb21jYXQ1NUNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDU1Q29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IG51bWJlci4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIFJldHVybiBvbmx5IGFuIEhUVFAgcG9ydCBmcm9tIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JCQlpZiAocG9ydC5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikgJiYgcG9ydC5nZXRJZCgpLmluZGV4T2YoJy8nKSA8IDApCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJU3RyaW5nIGluc3RhbmNlU2VydmljZU5hbWUgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgbmFtZSA9ICJIVFRQLzEuMSI7Ci0JCQkJCVN0cmluZyBwcm90b2NvbDIgPSAiSFRUUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2woKTsKLQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiSFRUUCIpKSB7Ci0JCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiQUpQIikpIHsKLQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQkJcHJvdG9jb2wyID0gIkFKUCI7IAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gR2V0IFRvbWNhdCBlcXVpdmFsZW50IG5hbWUgaWYgcHJvdG9jb2wgaGFuZGxlciBjbGFzcyBzcGVjaWZpZWQKLQkJCQkJCQluYW1lID0gKFN0cmluZylwcm90b2NvbEhhbmRsZXJNYXAuZ2V0KHByb3RvY29sKTsKLQkJCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIFByZXBhcmUgc2ltcGxlIHByb3RvY29sIHN0cmluZyBmb3IgU2VydmVyUG9ydCBwcm90b2NvbAotCQkJCQkJCQlpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJy8nKTsKLQkJCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQkJCXByb3RvY29sMiA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJcHJvdG9jb2wyID0gbmFtZTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gU3BlY2lmaWVkIHByb3RvY29sIGlzIHVua25vd24sIGp1c3QgdXNlIGFzIGlzCi0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCQkJcHJvdG9jb2wyID0gcHJvdG9jb2w7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwcm90b2NvbDIudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCVN0cmluZyBzZWN1cmUgPSBjb25uZWN0b3IuZ2V0U2VjdXJlKCk7Ci0JCQkJCWlmIChzZWN1cmUgIT0gbnVsbCAmJiBzZWN1cmUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluYW1lID0gIlNTTCI7Ci0JCQkJCQlwcm90b2NvbDIgPSAiU1NMIjsKLQkJCQkJfSBlbHNlCi0JCQkJCQlhZHZhbmNlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgcG9ydElkOwotCQkJCQlpZiAoaW5zdGFuY2VTZXJ2aWNlTmFtZSAhPSBudWxsICYmIGluc3RhbmNlU2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2UuZ2V0TmFtZSgpKSkKLQkJCQkJCXBvcnRJZCA9IEludGVnZXIudG9TdHJpbmcoaik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcnRJZCA9IGkgKyIvIiArIGo7Ci0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChwb3J0SWQsIG5hbWUsIHBvcnQsIHByb3RvY29sMiwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJcmVsb2FkID0gImZhbHNlIjsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQlyZWxvYWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHByb2plY3QgcmVmcyIsIGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRIb3N0V29ya0RpcmVjdG9yeShiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoLCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlUGF0aCwgY29udGV4dCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDcpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NS41IGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChwYXRoLmFwcGVuZCgid2ViLnhtbCIpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQkvLyBsb2FkIGNvbnRleHQueG1sIGZpbGUKLQkJCUZpbGUgZmlsZSA9IHBhdGguYXBwZW5kKCJjb250ZXh0LnhtbCIpLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJY29udGV4dERvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkpOwotCQkJZWxzZQotCQkJCWNvbnRleHREb2N1bWVudCA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQkvLyBsb2FkIHByb3BlcnRpZXMgZmlsZQotCQkJZmlsZSA9IHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJZWxzZQotCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY1LjUgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jaW1wb3J0RnJvbVBhdGgoSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCXdoaWxlIChzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KDApKSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElGb2xkZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgMTIwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIGNvbnRleHQueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNvbnRleHQueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRleHREb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29udGV4dERvY3VtZW50ID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCB0b21jYXQtdXNlcnMueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wb2xpY3kKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wcm9wZXJ0aWVzCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJcHJvcGVydGllc0ZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA1KTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBzYXZlIGZpbGVzCi0JCQlpZiAoZm9yY2VEaXJ0eSB8fCBpc1NlcnZlckRpcnR5KSB7Ci0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkgJiYgY29udGV4dERvY3VtZW50ICE9IG51bGwpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJjb250ZXh0LnhtbCIpLnRvT1NTdHJpbmcoKSwgY29udGV4dERvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b09TU3RyaW5nKCksIHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwgJiYgZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIEFsbCBmaWxlcyBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGRlc2luYXRpb24gcGF0aCBmb3IgdGhlIGZpbGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAxMjAwKTsKLQkJCQotCQkJLy8gc2F2ZSBzZXJ2ZXIueG1sCi0JCQlieXRlW10gZGF0YSA9IHNlcnZlckZhY3RvcnkuZ2V0Q29udGVudHMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChpc1NlcnZlckRpcnR5KQotCQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjb250ZXh0LnhtbAotCQkJaWYgKGNvbnRleHREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHMoY29udGV4dERvY3VtZW50KTsKLQkJCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNvbnRleHQueG1sIik7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wb2xpY3kKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeUZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wcm9wZXJ0aWVzCi0JCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgewotCQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlLmdldEJ5dGVzKCkpOwotCQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucHJvcGVydGllcyIpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJfSBlbHNlCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY1LjUgY29uZmlndXJhdGlvbiB0byAiICsgZm9sZGVyLnRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc01EQkxpc3RlbmVyKFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IGNvdW50ID0gc2VydmVyLmdldExpc3RlbmVyQ291bnQoKTsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IHNlcnZlci5nZXRMaXN0ZW5lcihpKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkuaW5kZXhPZigibWJlYW4iKSA+PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuY3JlYXRlQ29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWlmICgic2VydmVyIi5lcXVhbHMoaWQpKSB7Ci0JCQkJc2VydmVyLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlpbnQgaSA9IGlkLmluZGV4T2YoIi8iKTsKLQkJCS8vIElmIGEgY29ubmVjdG9yIGluIHRoZSBpbnN0YW5jZSBTZXJ2aWNlCi0JCQlpZiAoaSA8IDApIHsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQpOwotCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJaWYgKGNvbm5lY3RvciAhPSBudWxsKSB7Ci0JCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBFbHNlIGEgY29ubmVjdG9yIGluIGFub3RoZXIgU2VydmljZQotCQkJZWxzZSB7Ci0JCQkJaW50IHNlcnZOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZygwLCBpKSk7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZyhpICsgMSkpOwotCQkJCQotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKHNlcnZOdW0pOwotCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQoaW5kZXgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQuc2V0UGF0aChwYXRoKTsKLQkJCQljb250ZXh0LnNldERvY0Jhc2UoZG9jQmFzZSk7Ci0JCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKHJlbG9hZGFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLCBkb2NCYXNlLCBudWxsLCByZWxvYWRhYmxlKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtb2R1bGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KGluZGV4KTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcmVmICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgY29udGV4dCBjb25maWd1cmF0aW9uIGZvdW5kIGluIE1FVEEtSU5GL2NvbnRleHQueG1sIGZpbGVzCi0JICogcHJlc2VudCBpbiBwcm9qZWN0cyB0byBwdWJsaXNoZWQgc2VydmVyLnhtbC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIGNhdGFsaW5hIGluc3RhbmNlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBkZXBsb3lEaXIgcGF0aCB0byBkZXBsb3ltZW50IGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiByZXN1bHQgb2Ygb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcHVibGlzaENvbnRleHRDb25maWcoSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIucHVibGlzaENhdGFsaW5hQ29udGV4dENvbmZpZyhiYXNlRGlyLCBkZXBsb3lEaXIsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgY29udGV4dHMgaW4gc2VydmVyLnhtbCB0byBzZXJ2ZSBwcm9qZWN0cyBkaXJlY3RseSB3aXRob3V0Ci0JICogcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIGNhdGFsaW5hIGluc3RhbmNlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiByZXN1bHQgb2Ygb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdXBkYXRlQ29udGV4dHNUb1NlcnZlRGlyZWN0bHkoSVBhdGggYmFzZURpciwgU3RyaW5nIGxvYWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KGJhc2VEaXIsIGxvYWRlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW51cCB0aGUgc2VydmVyIGluc3RhbmNlLiAgVGhpcyBjb25zaXN0cyBvZiBkZWxldGluZyB0aGUgd29yawotCSAqIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggQ29udGV4dHMgdGhhdCBhcmUgZ29pbmcgYXdheSBpbiB0aGUKLQkgKiB1cCBjb21pbmcgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnksIGkuZS4gY2F0YWxpbmEuYmFzZQotCSAqIEBwYXJhbSBpbnN0YWxsRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKG5vdCBjdXJyZW50bHkgdXNlZCkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gTXVsdGlTdGF0dXMgY29udGFpbmluZyByZXN1bHRzIG9mIHRoZSBjbGVhbnVwIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggYmFzZURpciwgSVBhdGggaW5zdGFsbERpciwgYm9vbGVhbiByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jbGVhbnVwQ2F0YWxpbmFTZXJ2ZXIoYmFzZURpciwgaW5zdGFsbERpciwgcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgbW9kdWxlcywgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCwgSVBhdGgsIFRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgdG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIubG9jYWxpemVDb25maWd1cmF0aW9uKGJhc2VEaXIsIGRlcGxveURpciwgdG9tY2F0U2VydmVyLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyMjczYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNTUgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDU1SGFuZGxlciBleHRlbmRzIFRvbWNhdDUwSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aFdpdGhGb2xkZXJDaGVjayhpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF81NSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpOwotCQlpZiAoIjIuMiIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjMiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi40Ii5lcXVhbHModmVyc2lvbikpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzU1LCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDYwQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ2MENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3ODY2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDYwQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlckluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLS8qKgotICogVG9tY2F0IHY2LjAgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ2MENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUb21jYXRDb25maWd1cmF0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0UgPSAiQ2F0YWxpbmEiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IGNvbnRleHREb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCB0b21jYXRVc2Vyc0RvY3VtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBwb2xpY3lGaWxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9wZXJ0aWVzRmlsZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBwcm90b2NvbEhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsICJIVFRQLzEuMSIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExTmlvUHJvdG9jb2wiLCAiSFRUUC8xLjEiKTsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMUFwclByb3RvY29sIiwgIkhUVFAvMS4xIik7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmFqcC5BanBBcHJQcm90b2NvbCIsICJBSlAvMS4zIik7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuamsuc2VydmVyLkprQ295b3RlSGFuZGxlciIsICJBSlAvMS4zIik7Ci0JfQotCQotCS8qKgotCSAqIFRvbWNhdDYwQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NjBDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gUmV0dXJuIG9ubHkgYW4gSFRUUCBwb3J0IGZyb20gdGhlIHNlbGVjdGVkIFNlcnZpY2UKLQkJCWlmIChwb3J0LmdldFByb3RvY29sKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSAmJiBwb3J0LmdldElkKCkuaW5kZXhPZignLycpIDwgMCkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSBtYXBwaW5ncy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gd2ViQXBwRG9jdW1lbnQuZ2V0TWltZU1hcHBpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgU2VydmVyUG9ydHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gdXNlcy4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJLy8gZmlyc3QgYWRkIHNlcnZlciBwb3J0Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoc2VydmVyLmdldFBvcnQoKSk7Ci0JCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQoInNlcnZlciIsIE1lc3NhZ2VzLnBvcnRTZXJ2ZXIsIHBvcnQsICJUQ1BJUCIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCS8vIGFkZCBjb25uZWN0b3JzCi0JCXRyeSB7Ci0JCQlTdHJpbmcgaW5zdGFuY2VTZXJ2aWNlTmFtZSA9IHNlcnZlckluc3RhbmNlLmdldFNlcnZpY2UoKS5nZXROYW1lKCk7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaW50IHNpemUyID0gc2VydmljZS5nZXRDb25uZWN0b3JDb3VudCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3Ioaik7Ci0JCQkJCVN0cmluZyBuYW1lID0gIkhUVFAvMS4xIjsKLQkJCQkJU3RyaW5nIHByb3RvY29sMiA9ICJIVFRQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChjb25uZWN0b3IuZ2V0UG9ydCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCVN0cmluZyBwcm90b2NvbCA9IGNvbm5lY3Rvci5nZXRQcm90b2NvbCgpOwotCQkJCQlpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWlmIChwcm90b2NvbC5zdGFydHNXaXRoKCJIVFRQIikpIHsKLQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwcm90b2NvbC5zdGFydHNXaXRoKCJBSlAiKSkgewotCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCQlwcm90b2NvbDIgPSAiQUpQIjsgCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBHZXQgVG9tY2F0IGVxdWl2YWxlbnQgbmFtZSBpZiBwcm90b2NvbCBoYW5kbGVyIGNsYXNzIHNwZWNpZmllZAotCQkJCQkJCW5hbWUgPSAoU3RyaW5nKXByb3RvY29sSGFuZGxlck1hcC5nZXQocHJvdG9jb2wpOwotCQkJCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gUHJlcGFyZSBzaW1wbGUgcHJvdG9jb2wgc3RyaW5nIGZvciBTZXJ2ZXJQb3J0IHByb3RvY29sCi0JCQkJCQkJCWludCBpbmRleCA9IG5hbWUuaW5kZXhPZignLycpOwotCQkJCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCQkJcHJvdG9jb2wyID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlwcm90b2NvbDIgPSBuYW1lOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBTcGVjaWZpZWQgcHJvdG9jb2wgaXMgdW5rbm93biwganVzdCB1c2UgYXMgaXMKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJCQlwcm90b2NvbDIgPSBwcm90b2NvbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHByb3RvY29sMi50b0xvd2VyQ2FzZSgpLmVxdWFscygiaHR0cCIpKQotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJU3RyaW5nIHNlY3VyZSA9IGNvbm5lY3Rvci5nZXRTZWN1cmUoKTsKLQkJCQkJaWYgKHNlY3VyZSAhPSBudWxsICYmIHNlY3VyZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW5hbWUgPSAiU1NMIjsKLQkJCQkJCXByb3RvY29sMiA9ICJTU0wiOwotCQkJCQl9IGVsc2UKLQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBwb3J0SWQ7Ci0JCQkJCWlmIChpbnN0YW5jZVNlcnZpY2VOYW1lICE9IG51bGwgJiYgaW5zdGFuY2VTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZS5nZXROYW1lKCkpKQotCQkJCQkJcG9ydElkID0gSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9ydElkID0gaSArIi8iICsgajsKLQkJCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KHBvcnRJZCwgbmFtZSwgcG9ydCwgcHJvdG9jb2wyLCBjb250ZW50VHlwZXMsIGFkdmFuY2VkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBzZXJ2ZXIgcG9ydHMiLCBlKTsKLQkJfQotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQlpZiAocmVsb2FkID09IG51bGwpCi0JCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQljb250ZXh0LmdldERvY0Jhc2UoKSwgY29udGV4dC5nZXRTb3VyY2UoKSwKLQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRIb3N0V29ya0RpcmVjdG9yeShiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoLCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlUGF0aCwgY29udGV4dCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDcpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NS41IGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChwYXRoLmFwcGVuZCgid2ViLnhtbCIpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlGaWxlIGZpbGUgPSBwYXRoLmFwcGVuZCgiY29udGV4dC54bWwiKS50b0ZpbGUoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWNvbnRleHREb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIGxvYWQgcG9saWN5IGZpbGUKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCS8vIGxvYWQgcHJvcGVydGllcyBmaWxlCi0JCQlmaWxlID0gcGF0aC5hcHBlbmQoImNhdGFsaW5hLnByb3BlcnRpZXMiKS50b0ZpbGUoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXByb3BlcnRpZXNGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQllbHNlCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIGZyb20gIiArIHBhdGgudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBwYXRoLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNpbXBvcnRGcm9tUGF0aChJUGF0aCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRGcm9tUGF0aChJUGF0aCBwYXRoLCBib29sZWFuIGlzVGVzdEVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWQocGF0aCwgbW9uaXRvcik7Ci0JCQotCQkvLyBmb3IgdGVzdCBlbnZpcm9ubWVudCwgcmVtb3ZlIGV4aXN0aW5nIGNvbnRleHRzIHNpbmNlIGEgc2VwYXJhdGUKLQkJLy8gY2F0YWxpbmEuYmFzZSB3aWxsIGJlIHVzZWQKLQkJaWYgKGlzVGVzdEVudikgewotCQkJd2hpbGUgKHNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoMCkpIHsKLQkJCQkvLyBuby1vcAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCAxMjAwKTsKLQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY0LjAgY29uZmlnCi0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIG51bGwpKTsKLQkKLQkJCS8vIGxvYWQgc2VydmVyLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KGluKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KGZpbGUpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgY29udGV4dC54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY29udGV4dC54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGV4dERvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb250ZXh0RG9jdW1lbnQgPSBudWxsOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucHJvcGVydGllcyIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVsb2FkIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGZvcmNlRGlydHkgYm9vbGVhbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoSVBhdGggcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDUpOwotCQkJCi0JCQkvLyBtYWtlIHN1cmUgZGlyZWN0b3J5IGV4aXN0cwotCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJZm9yY2VEaXJ0eSA9IHRydWU7Ci0JCQkJcGF0aC50b0ZpbGUoKS5ta2RpcigpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpIHsKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9PU1N0cmluZygpLCBmb3JjZURpcnR5KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSAmJiBjb250ZXh0RG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoImNvbnRleHQueG1sIikudG9PU1N0cmluZygpLCBjb250ZXh0RG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCAmJiBmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnByb3BlcnRpZXMiKS50b0ZpbGUoKSkpOwotCQkJCWJ3LndyaXRlKHByb3BlcnRpZXNGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LiAgQWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMKLQkgKiBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIERlc2luYXRpb24gcGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAxMjAwKTsKLQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY29udGV4dC54bWwKLQkJCWlmIChjb250ZXh0RG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKGNvbnRleHREb2N1bWVudCk7Ci0JCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjb250ZXh0LnhtbCIpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJfQotCQkJCi0JCQkvLyBzYXZlIHRvbWNhdC11c2Vycy54bWwKLQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucHJvcGVydGllcwotCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKLQkJCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZS5nZXRCeXRlcygpKTsKLQkJCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCX0gZWxzZQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci50b1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNNREJMaXN0ZW5lcihTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBjb3VudCA9IHNlcnZlci5nZXRMaXN0ZW5lckNvdW50KCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXIoaSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKSAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpLmluZGV4T2YoIm1iZWFuIikgPj0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRNaW1lTWFwcGluZyhpbnQsIElNaW1lTWFwcGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQuYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmNyZWF0ZUNvbnRleHQoaW5kZXgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSAiICsgbW9kdWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGV4dGVuc2lvbiBvZiBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50Lm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoInNlcnZlciIuZXF1YWxzKGlkKSkgewotCQkJCXNlcnZlci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJaW50IGkgPSBpZC5pbmRleE9mKCIvIik7Ci0JCQkvLyBJZiBhIGNvbm5lY3RvciBpbiB0aGUgaW5zdGFuY2UgU2VydmljZQotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWlmIChjb25uZWN0b3IgIT0gbnVsbCkgewotCQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRWxzZSBhIGNvbm5lY3RvciBpbiBhbm90aGVyIFNlcnZpY2UKLQkJCWVsc2UgewotCQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoaSArIDEpKTsKLQkJCQkKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyBzZXJ2ZXIgcG9ydCAiICsgaWQsIGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbWltZSBtYXBwaW5nLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJd2ViQXBwRG9jdW1lbnQucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfTUFQUElOR19QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlcwotCSAqIHByZXNlbnQgaW4gcHJvamVjdHMgdG8gcHVibGlzaGVkIHNlcnZlci54bWwuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGVwbG95RGlyIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnB1Ymxpc2hDYXRhbGluYUNvbnRleHRDb25maWcoYmFzZURpciwgZGVwbG95RGlyLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIGNvbnRleHRzIGluIHNlcnZlci54bWwgdG8gc2VydmUgcHJvamVjdHMgZGlyZWN0bHkgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBsb2FkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci51cGRhdGVDb250ZXh0c1RvU2VydmVEaXJlY3RseShiYXNlRGlyLCBsb2FkZXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENsZWFudXAgdGhlIHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY29uc2lzdHMgb2YgZGVsZXRpbmcgdGhlIHdvcmsKLQkgKiBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIENvbnRleHRzIHRoYXQgYXJlIGdvaW5nIGF3YXkgaW4gdGhlCi0JICogdXAgY29taW5nIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFuY2UgZGlyZWN0b3J5LCBpLmUuIGNhdGFsaW5hLmJhc2UKLQkgKiBAcGFyYW0gaW5zdGFsbERpciBwYXRoIHRvIHNlcnZlciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChub3QgY3VycmVudGx5IHVzZWQpCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIE11bHRpU3RhdHVzIGNvbnRhaW5pbmcgcmVzdWx0cyBvZiB0aGUgY2xlYW51cCBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjbGVhbnVwU2VydmVyKElQYXRoIGJhc2VEaXIsIElQYXRoIGluc3RhbGxEaXIsIGJvb2xlYW4gcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY2xlYW51cENhdGFsaW5hU2VydmVyKGJhc2VEaXIsIGluc3RhbGxEaXIsIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIG1vZHVsZXMsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGgsIElQYXRoLCBUb21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmxvY2FsaXplQ29uZmlndXJhdGlvbihiYXNlRGlyLCBkZXBsb3lEaXIsIHRvbWNhdFNlcnZlciwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ2MEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NjBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzE0YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ2MEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNjAgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDYwSGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aFdpdGhGb2xkZXJDaGVjayhpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF82MCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gNi4wIC0gYWRkIGJvb3RzdHJhcC5qYXIgZnJvbSB0aGUgVG9tY2F0IGJpbiBkaXJlY3RvcnkKLQkJSVBhdGggYmluUGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgiYmluIik7Ci0JCWlmIChiaW5QYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlJUGF0aCBwYXRoID0gYmluUGF0aC5hcHBlbmQoImJvb3RzdHJhcC5qYXIiKTsKLQkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgic3RhcnQiKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoInN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHRlbXApOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0Q2F0YWxpbmFWTUFyZ3VtZW50cyhpbnN0YWxsUGF0aCwgY29uZmlnUGF0aCwgZGVwbG95UGF0aCwgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhpbnN0YWxsUGF0aCksIGlzVGVzdEVudik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpOwotCQlpZiAoIjIuMiIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjMiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi40Ii5lcXVhbHModmVyc2lvbil8fCAiMi41Ii5lcXVhbHModmVyc2lvbikpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzYwLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0U3RhbmRhcmRCYXNlRGlyZWN0b3J5KHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggYmFzZURpcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVDYXRhbGluYUluc3RhbmNlRGlyZWN0b3J5KGJhc2VEaXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZURlcGxveW1lbnREaXJlY3RvcnkoZGVwbG95UGF0aCwKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLkRFRkFVTFRfV0VCWE1MX1NFUlZMRVQyNSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShJUGF0aCwgVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGggYmFzZURpciwgVG9tY2F0U2VydmVyIHNlcnZlcikgewotCQlJU3RhdHVzIHN0YXR1czsKLQkJLy8gSWYgc2VydmluZyBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZywgbG9hZGVyIGphciBpcyBuZWVkZWQKLQkJLy8gVE9ETyBOZWVkIHRvIGV4YW1pbmUgY2F0YWxpbmEucHJvcGVydGllcyB0byBlbnN1cmUgbG9hZGVyIGphciBhbmQgY2F0YWxpbmEucHJvcGVydGllcyBhcmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5Ci0JCWlmIChzZXJ2ZXIuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQlzdGF0dXMgPSBUb21jYXRWZXJzaW9uSGVscGVyLmNvcHlMb2FkZXJKYXIoCi0JCQkJCWdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHNlcnZlcikuYXBwZW5kKCJsaWIiKSwKLQkJCQkJc2VydmVyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJLy8gSWYgY29weSBzdWNjZXNzZnVsIGFuZCBydW5uaW5nIGEgc2VwYXJhdGUgc2VydmVyIGluc3RhbmNlLCBtb2RpZnkgY2F0YWxpbmEucHJvcGVydGllcwotCQkJaWYgKHN0YXR1cy5pc09LKCkgJiYgc2VydmVyLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCQlzdGF0dXMgPSBUb21jYXRWZXJzaW9uSGVscGVyLnVwZGF0ZVByb3BlcnRpZXNUb1NlcnZlRGlyZWN0bHkoYmFzZURpciwgImxpYiIsICJjb21tb24iKTsKLQkJCX0KLQkJfQotCQkvLyBFbHNlIGVuc3VyZSBqYXIgaXMgcmVtb3ZlZAotCQllbHNlIHsKLQkJCVRvbWNhdFZlcnNpb25IZWxwZXIucmVtb3ZlTG9hZGVySmFyKAotCQkJCQlnZXRSdW50aW1lQmFzZURpcmVjdG9yeShzZXJ2ZXIpLmFwcGVuZCgibGliIiksCi0JCQkJCXNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCS8vIFRPRE8gRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCByZW1vdmFsIHdhcm5pbmcsIG1heWJlIG5vdGhpbmcKLQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRTaGFyZWRMb2FkZXIoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFyZWRMb2FkZXIoSVBhdGggYmFzZURpcikgewotCQlyZXR1cm4gImNvbW1vbiI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBzaW5jZSBUb21jYXQgNi54IHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgc2luY2UgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c0RlYnVnQXJndW1lbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVidWdBcmd1bWVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEVuZG9yc2VkRGlyZWN0b3JpZXMoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBpbnN0YWxsUGF0aC5hcHBlbmQoImVuZG9yc2VkIikudG9PU1N0cmluZygpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU5YmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLS8qKgotICogR2VuZXJpYyBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUb21jYXRDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSVRvbWNhdENvbmZpZ3VyYXRpb24sIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9QUk9QRVJUWSA9ICJwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfUE9SVF9QUk9QRVJUWSA9ICJtb2RpZnlQb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTUFQUElOR19QUk9QRVJUWSA9ICJhZGRNYXBwaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfTUFQUElOR19QUk9QRVJUWSA9ICJyZW1vdmVNYXBwaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfTUFQUElOR19QUk9QRVJUWSA9ICJtb2RpZnlNYXBwaW5nIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSA9ICJtb2RpZnlXZWJNb2R1bGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9XRUJfTU9EVUxFX1BST1BFUlRZID0gImFkZFdlYk1vZHVsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFkgPSAicmVtb3ZlV2ViTW9kdWxlIjsKLQkKLQlwcm90ZWN0ZWQgSUZvbGRlciBjb25maWdQYXRoOwotCi0JLy8gcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycwotCXByaXZhdGUgdHJhbnNpZW50IExpc3QgcHJvcGVydHlMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUb21jYXRDb25maWd1cmF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqLwotCXB1YmxpYyBUb21jYXRDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZ1BhdGggPSBwYXRoOwotCQkvKnRyeSB7Ci0JCQlsb2FkKGNvbmZpZ1BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0qLwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZvbGRlciBnZXRGb2xkZXIoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgZmlsZXMgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGluIHRoZSB3b3JrYmVuY2gKLQkgKiB0byB0aGUgZ2l2ZW4gbG9jYXRpb24uICBDYW4gYmUgb3ZlcnJpZGRlbiBieSB2ZXJzaW9uIHNwZWNpZmljCi0JICogY2xhc3MgdG8gbW9kaWZ5IG9yIGVuaGFuY2Ugd2hhdCBwdWJsaXNoIGRvZXMuCi0JICogCi0JICogQHBhcmFtIHRvbWNhdERpciBEZXN0aW5hdGlvbiB0b21jYXQgZGlyZWN0b3J5LiAgRXF1aXZhbGVudCB0byBjYXRhbGluYS5iYXNlCi0JICogICAgICAgICAgICAgICAgICBmb3IgVG9tY2F0IDQueCBhbmQgdXAuCi0JICogQHBhcmFtIGRvQmFja3VwIEJhY2t1cCBleGlzdGluZyBjb25maWd1cmF0aW9uIGZpbGVzICh0cnVlIGlmIG5vdCB0ZXN0IG1vZGUpLgotCSAqIEBwYXJhbSBtb25pdG9yIFByb2dyZXNzIG1vbml0b3IgdG8gdXNlCi0JICogQHJldHVybiByZXN1bHQgb2Ygb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgYmFja3VwQW5kUHVibGlzaChJUGF0aCB0b21jYXREaXIsIGJvb2xlYW4gZG9CYWNrdXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIG51bGwpOwotCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQmFja3VwIGFuZCBwdWJsaXNoIik7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQotCQl0cnkgewotCQkJSVBhdGggYmFja3VwID0gbnVsbDsKLQkJCWlmIChkb0JhY2t1cCkgewotCQkJCS8vIGNyZWF0ZSBiYWNrdXAgZGlyZWN0b3J5Ci0JCQkJYmFja3VwID0gdG9tY2F0RGlyLmFwcGVuZCgiYmFja3VwIik7Ci0JCQkJaWYgKCFiYWNrdXAudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJCWJhY2t1cC50b0ZpbGUoKS5ta2RpcigpOwotCQkJfQotCQkJYmFja3VwRm9sZGVyKGdldEZvbGRlcigpLCB0b21jYXREaXIuYXBwZW5kKCJjb25mIiksIGJhY2t1cCwgbXMsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiYmFja3VwQW5kUHVibGlzaCgpIGVycm9yIiwgZSk7Ci0JCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCQltcy5hZGQocyk7Ci0JCX0KLQotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIG1zOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBiYWNrdXBGb2xkZXIoSUZvbGRlciBmb2xkZXIsIElQYXRoIGNvbmZEaXIsIElQYXRoIGJhY2t1cCwgTXVsdGlTdGF0dXMgbXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb25maWd1cmF0aW9uVGFzaywgc2l6ZSAqIDEwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGNoaWxkcmVuW2ldOwotCQkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGVyUHVibGlzaFRhc2ssIG5ldyBTdHJpbmdbXSB7bmFtZX0pKTsKLQkJCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQdWJsaXNoaW5nICIgKyBuYW1lKTsKLQotCQkJCQkvLyBiYWNrdXAgYW5kIGNvcHkgZmlsZQotCQkJCQlib29sZWFuIGNvcHkgPSB0cnVlOwotCQkJCQlpZiAoYmFja3VwICE9IG51bGwgJiYgIShiYWNrdXAuYXBwZW5kKG5hbWUpLnRvRmlsZSgpLmV4aXN0cygpKSkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBGaWxlVXRpbC5jb3B5RmlsZShjb25mRGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCksIGJhY2t1cCArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0JCQkJCQltcy5hZGQoc3RhdHVzKTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCQljb3B5ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChjb3B5KSB7Ci0JCQkJCQlTdHJpbmcgZGVzdFBhdGggPSBjb25mRGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCk7Ci0JCQkJCQlTdHJpbmcgZGVzdENvbnRlbnRzID0gbnVsbDsKLQkJCQkJCVN0cmluZyBzcmNDb250ZW50cyA9IG51bGw7Ci0JCQkJCQlGaWxlIGRlc3QgPSBuZXcgRmlsZShkZXN0UGF0aCk7Ci0JCQkJCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCQkJCUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdFBhdGgpOwotCQkJCQkJCWRlc3RDb250ZW50cyA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGZpcyk7Ci0JCQkJCQkJaWYgKGRlc3RDb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCWZpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJCQkJc3JjQ29udGVudHMgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhmaXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkZXN0Q29udGVudHMgPT0gbnVsbCB8fCBzcmNDb250ZW50cyA9PSBudWxsIHx8ICFzcmNDb250ZW50cy5lcXVhbHMoZGVzdENvbnRlbnRzKSkgewotCQkJCQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQkJCW1zLmFkZChGaWxlVXRpbC5jb3B5RmlsZShpbiwgZGVzdFBhdGgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImJhY2t1cEFuZFB1Ymxpc2goKSBlcnJvciIsIGUpOwotCQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhY2t1cFBhdGgoSVBhdGggcGF0aCwgSVBhdGggY29uZkRpciwgSVBhdGggYmFja3VwLCBNdWx0aVN0YXR1cyBtcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhdGgudG9GaWxlKCkubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIHNpemUgKiAxMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoZXJQdWJsaXNoVGFzaywgbmV3IFN0cmluZ1tdIHtuYW1lfSkpOwotCQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQdWJsaXNoaW5nICIgKyBuYW1lKTsKLQotCQkJCS8vIGJhY2t1cCBhbmQgY29weSBmaWxlCi0JCQkJYm9vbGVhbiBjb3B5ID0gdHJ1ZTsKLQkJCQlpZiAoYmFja3VwICE9IG51bGwgJiYgIShiYWNrdXAuYXBwZW5kKG5hbWUpLnRvRmlsZSgpLmV4aXN0cygpKSkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEZpbGVVdGlsLmNvcHlGaWxlKGNvbmZEaXIuYXBwZW5kKG5hbWUpLnRvT1NTdHJpbmcoKSwgYmFja3VwICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKLQkJCQkJbXMuYWRkKHN0YXR1cyk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCWNvcHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvcHkpCi0JCQkJCW1zLmFkZChGaWxlVXRpbC5jb3B5RmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjb25mRGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiYmFja3VwQW5kUHVibGlzaCgpIGVycm9yIiwgZSk7Ci0JCQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBub3RoaW5nIHRvIGRvCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBsb2FkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgbm90aGluZyB0byBkbwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgY2xlYW51cFNlcnZlcihJUGF0aCBjb25mRGlyLCBJUGF0aCBpbnN0YWxsRGlyLCBib29sZWFuIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgbm90aGluZyB0byBjbGVhbgotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogTWFrZSBhbnkgbG9jYWwgY2hhbmdlcyB0byB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXQgdGhlIHNwZWNpZmllZCBydW50aW1lCi0JICogYmFzZSBkaXJlY3RvcnkgbmVlZGVkIHRvIGNvbXBsZXRlIHB1Ymxpc2hpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBydW50aW1lIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveURpciBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2ZXIgc2VydmVyIGJlaW5nIGxvY2FsaXplZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYWluIHNlcnZlciBwb3J0LgotCSAqIEByZXR1cm4gU2VydmVyUG9ydAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmaXggdGhhdCBpcyB1c2VkIGluIGZyb250IG9mIHRoZQotCSAqIHdlYiBtb2R1bGUgcGF0aCBwcm9wZXJ0eS4gKGUuZy4gIndlYmFwcHMiKQotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlUHJlZml4KCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGlhbCBVUkwgYXBwbGljYWJsZSB0byB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViTW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIHBhcnRpYWwgVVJMCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXZWJNb2R1bGVVUkwoSU1vZHVsZSB3ZWJNb2R1bGUpIHsKLQkJV2ViTW9kdWxlIG1vZHVsZSA9IGdldFdlYk1vZHVsZSh3ZWJNb2R1bGUpOwotCQlpZiAobW9kdWxlICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kdWxlLmdldFBhdGgoKTsKLQkJCi0JCUlXZWJNb2R1bGUgd2ViTW9kdWxlMiA9IChJV2ViTW9kdWxlKSB3ZWJNb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCXJldHVybiAiLyIgKyB3ZWJNb2R1bGUyLmdldENvbnRleHRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gbW9kdWxlIGZyb20gdGhlIGNvbmZpZy4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICogQHJldHVybiBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlIGdldFdlYk1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJU3RyaW5nIG1lbWVudG8gPSBtb2R1bGUuZ2V0SWQoKTsKLQkKLQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJaWYgKG1lbWVudG8uZXF1YWxzKHdlYk1vZHVsZS5nZXRNZW1lbnRvKCkpKSB7Ci0JCQkJcmV0dXJuIHdlYk1vZHVsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb3BlcnR5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gcHJvcGVydHkgZXZlbnQiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb3BlcnR5TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qcHVibGljIHZvaWQgaW1wb3J0RnJvbVJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWQocnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZCgiY29uZiIpLCBtb25pdG9yKTsKLQl9Ki8KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSk7Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I3JlbW92ZVdlYk1vZHVsZShpbnQpCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggcGF0aCB0byBzZXJ2ZXIgcnVudGltZSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHBhdGggZm9yIHRoZSBzZXJ2ZXIncyB3b3JrIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvbiB0aGUKLQkgKiBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIHBhdGggdG8gc2VydmVyIHJ1bnRpbWUgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vZHVsZSBhIFRvbWNhdCB3ZWIgbW9kdWxlCi0JICogQHJldHVybiBwYXRoIGZvciB0aGUgbW9kdWxlJ3Mgd29yayBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVG9tY2F0Q29uZmlndXJhdGlvblsiICsgZ2V0Rm9sZGVyKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTRmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoIGNvbmZpZ3VyYXRpb24gY291bGQgbm90IGZpbmQgc2VydmVyIik7Ci0JCQkvLyB0aHJvdyBDb3JlRXhjZXB0aW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXIuc2hvdWxkUHVibGlzaCgpICYmIFNlcnZlckNvcmUuaXNBdXRvUHVibGlzaGluZygpKQotCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBtb25pdG9yKTsKLQkJCi0JCVRvbWNhdFNlcnZlckJlaGF2aW91ciB0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJCi0JCVN0cmluZyBtYWluVHlwZU5hbWUgPSB0b21jYXRTZXJ2ZXIuZ2V0UnVudGltZUNsYXNzKCk7Ci0JCQotCQlJVk1JbnN0YWxsIHZtID0gdmVyaWZ5Vk1JbnN0YWxsKGNvbmZpZ3VyYXRpb24pOwotCQkKLQkJSVZNUnVubmVyIHJ1bm5lciA9IHZtLmdldFZNUnVubmVyKG1vZGUpOwotCQlpZiAocnVubmVyID09IG51bGwpCi0JCQlydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCQotCQlGaWxlIHdvcmtpbmdEaXIgPSB2ZXJpZnlXb3JraW5nRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgd29ya2luZ0Rpck5hbWUgPSBudWxsOwotCQlpZiAod29ya2luZ0RpciAhPSBudWxsKQotCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJLy8gUHJvZ3JhbSAmIFZNIGFyZ3MKLQkJU3RyaW5nIHBnbUFyZ3MgPSBnZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgdm1BcmdzID0gZ2V0Vk1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0JCVN0cmluZ1tdIGVudnAgPSBnZXRFbnZpcm9ubWVudChjb25maWd1cmF0aW9uKTsKLQkJCi0JCUV4ZWN1dGlvbkFyZ3VtZW50cyBleGVjQXJncyA9IG5ldyBFeGVjdXRpb25Bcmd1bWVudHModm1BcmdzLCBwZ21BcmdzKTsKLQkJCi0JCS8vIFZNLXNwZWNpZmljIGF0dHJpYnV0ZXMKLQkJTWFwIHZtQXR0cmlidXRlc01hcCA9IGdldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKGNvbmZpZ3VyYXRpb24pOwotCQkKLQkJLy8gQ2xhc3NwYXRoCi0JCVN0cmluZ1tdIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZyA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24obWFpblR5cGVOYW1lLCBjbGFzc3BhdGgpOwotCQlydW5Db25maWcuc2V0UHJvZ3JhbUFyZ3VtZW50cyhleGVjQXJncy5nZXRQcm9ncmFtQXJndW1lbnRzQXJyYXkoKSk7Ci0JCXJ1bkNvbmZpZy5zZXRWTUFyZ3VtZW50cyhleGVjQXJncy5nZXRWTUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyTmFtZSk7Ci0JCXJ1bkNvbmZpZy5zZXRFbnZpcm9ubWVudChlbnZwKTsKLQkJcnVuQ29uZmlnLnNldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKHZtQXR0cmlidXRlc01hcCk7Ci0JCQotCQkvLyBCb290cGF0aAotCQlTdHJpbmdbXSBib290cGF0aCA9IGdldEJvb3RwYXRoKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoYm9vdHBhdGggIT0gbnVsbCAmJiBib290cGF0aC5sZW5ndGggPiAwKQotCQkJcnVuQ29uZmlnLnNldEJvb3RDbGFzc1BhdGgoYm9vdHBhdGgpOwotCQkKLQkJc2V0RGVmYXVsdFNvdXJjZUxvY2F0b3IobGF1bmNoLCBjb25maWd1cmF0aW9uKTsKLQkJCi0JCWlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKSB7Ci0JCQl0cnkgewotCQkJCVNlcnZlclByb2ZpbGVyRGVsZWdhdGUuY29uZmlndXJlUHJvZmlsaW5nKGxhdW5jaCwgdm0sIHJ1bkNvbmZpZywgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJdG9tY2F0U2VydmVyLnN0b3BJbXBsKCk7Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIExhdW5jaCB0aGUgY29uZmlndXJhdGlvbgotCQl0b21jYXRTZXJ2ZXIuc2V0dXBMYXVuY2gobGF1bmNoLCBtb2RlLCBtb25pdG9yKTsKLQkJdHJ5IHsKLQkJCXJ1bm5lci5ydW4ocnVuQ29uZmlnLCBsYXVuY2gsIG1vbml0b3IpOwotCQkJdG9tY2F0U2VydmVyLmFkZFByb2Nlc3NMaXN0ZW5lcihsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlIC0gcHJvY2VzcyBmYWlsZWQKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYzOTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLkh0dHBMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotLyoqCi0gKiBMYXVuY2hhYmxlIGFkYXB0ZXIgZGVsZWdhdGUgZm9yIFdlYiByZXNvdXJjZXMgaW4gVG9tY2F0LgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZUFydGlmYWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZU9iamVjdCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlRvbWNhdExhdW5jaGFibGVBZGFwdGVyICIgKyBzZXJ2ZXIgKyAiLSIgKyBtb2R1bGVPYmplY3QpOwotCQlpZiAoc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpICYmCi0JCQkhKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kdWxlT2JqZWN0LmdldE1vZHVsZSgpLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlci5sb2FkQWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MsIG51bGwpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZU9iamVjdC5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAicm9vdDogIiArIHVybCk7Ci0JCQkKLQkJCWlmIChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KSB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIG1vZHVsZU9iamVjdDsKLQkJCQlpZiAoc2VydmxldC5nZXRBbGlhcygpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBzZXJ2bGV0LmdldEFsaWFzKCk7Ci0JCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsIHBhdGgpOwotCQkJCX0gZWxzZQotCQkJCQl1cmwgPSBuZXcgVVJMKHVybCwgInNlcnZsZXQvIiArIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzTmFtZSgpKTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpIHsKLQkJCQlXZWJSZXNvdXJjZSByZXNvdXJjZSA9IChXZWJSZXNvdXJjZSkgbW9kdWxlT2JqZWN0OwotCQkJCVN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJwYXRoOiAiICsgcGF0aCk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgSHR0cExhdW5jaGFibGUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgVVJMIGZvciAiICsgbW9kdWxlT2JqZWN0LCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWEzNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogVGhlIFRvbWNhdCBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByb3RlY3RlZCBzdGF0aWMgVG9tY2F0UGx1Z2luIHNpbmdsZXRvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF8zMiA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUXzQwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfNDEgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF81MCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUXzU1ID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfNjAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSSUZZX0lOU1RBTExfRklMRSA9ICJ2ZXJpZnlJbnN0YWxsLnByb3BlcnRpZXMiOwotCXByb3RlY3RlZCBzdGF0aWMgVmVyaWZ5UmVzb3VyY2VTcGVjW10gdmVyaWZ5MzI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBWZXJpZnlSZXNvdXJjZVNwZWNbXSB2ZXJpZnk0MDsKLQlwcm90ZWN0ZWQgc3RhdGljIFZlcmlmeVJlc291cmNlU3BlY1tdIHZlcmlmeTQxOwotCXByb3RlY3RlZCBzdGF0aWMgVmVyaWZ5UmVzb3VyY2VTcGVjW10gdmVyaWZ5NTA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBWZXJpZnlSZXNvdXJjZVNwZWNbXSB2ZXJpZnk1NTsKLQlwcm90ZWN0ZWQgc3RhdGljIFZlcmlmeVJlc291cmNlU3BlY1tdIHZlcmlmeTYwOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBlbXB0eUluc3RhbGxEaXJTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpckVtcHR5LCBudWxsKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgd3JvbmdEaXJWZXJzaW9uU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckluc3RhbGxEaXJXcm9uZ1ZlcnNpb24sIG51bGwpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBpbnN0YWxsRGlyRG9lc05vdEV4aXN0ID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckluc3RhbGxEaXJEb2VzTm90RXhpc3QsIG51bGwpOwotCi0JLyoqCi0JICogVG9tY2F0UGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRvbWNhdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC5Ub21jYXRQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvbWNhdFBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbXQgdHlwZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJlZmVyZW5jZShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotCQlnZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoaWQsIHZhbHVlKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBUb21jYXQgaG9tZSBkaXJlY3RvcnkuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VG9tY2F0U3RhdGVMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgVG9tY2F0IHZlcnNpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIGEgdmVyc2lvbiBoYW5kbGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZC5pbmRleE9mKCJydW50aW1lIikgPiAwKQotCQkJaWQgPSBpZC5zdWJzdHJpbmcoMCwgMzApICsgaWQuc3Vic3RyaW5nKDM4KTsKLQkJLy9pZCA9IGlkLnN1YnN0cmluZygwLCBpZC5sZW5ndGgoKSAtIDgpOwotCQlpZiAoVE9NQ0FUXzMyLmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDMySGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNDAuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NDBIYW5kbGVyKCk7Ci0JCWVsc2UgaWYgKFRPTUNBVF80MS5lcXVhbHMoaWQpKQotCQkJcmV0dXJuIG5ldyBUb21jYXQ0MUhhbmRsZXIoKTsKLQkJZWxzZSBpZiAoVE9NQ0FUXzUwLmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDUwSGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNTUuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NTVIYW5kbGVyKCk7Ci0JCWVsc2UgaWYgKFRPTUNBVF82MC5lcXVhbHMoaWQpKQotCQkJcmV0dXJuIG5ldyBUb21jYXQ2MEhhbmRsZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGZpbGVzIHRvIHZlcmlmeSB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZFZlcmlmeUZpbGVzKCkgewotCQlpZiAodmVyaWZ5MzIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJLy8gYmFja3VwIChlbXB0eSkgdmFsdWVzCi0JCXZlcmlmeTMyID0gbmV3IFZlcmlmeVJlc291cmNlU3BlY1swXTsKLQkJdmVyaWZ5NDAgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjWzBdOwotCQl2ZXJpZnk0MSA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbMF07Ci0JCXZlcmlmeTUwID0gbmV3IFZlcmlmeVJlc291cmNlU3BlY1swXTsKLQkJdmVyaWZ5NTUgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjWzBdOwotCQl2ZXJpZnk2MCA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbMF07Ci0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9IGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVkVSSUZZX0lOU1RBTExfRklMRSk7Ci0JCQl1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcC5sb2FkKHVybC5vcGVuU3RyZWFtKCkpOwotCi0JCQkvLyBDaGVjayBiYWNrZG9vciBzeXN0ZW0gcHJvcGVydHksIHVzZSBpbnRlcm5hbCBzcGVjIGlmIG5vdCBmb3VuZAotCQkJU3RyaW5nIHZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTMyaW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5MzJpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnkzMjogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnkzMiA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTMyKTsKLQotCQkJLy8gdjQuMAotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCXZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTQwaW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5NDBpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnk0MDogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnk0MCA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTQwKTsKLQkJCQotCQkJLy8gdjQuMQotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCXZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTQxaW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5NDFpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnk0MTogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnk0MSA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTQxKTsKLQkJCQotCQkJLy8gdjUuMAotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCXZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTUwaW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5NTBpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnk1MDogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnk1MCA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTUwKTsKLQotCQkJLy8gdjUuNQotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCXZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTU1aW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5NTVpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnk1NTogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnk1NSA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTU1KTsKLQotCQkJLy8gdjYuMAotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCXZlcmlmeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQTFVHSU5fSUQgKyAiLnZlcmlmeTYwaW5zdGFsbCIpOwotCQkJaWYgKHZlcmlmeSA9PSBudWxsKSB7Ci0JCQkJdmVyaWZ5ID0gcC5nZXRQcm9wZXJ0eSgidmVyaWZ5NjBpbnN0YWxsIik7Ci0JCQl9Ci0JCQl2ZXJpZnkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjKHN0Lm5leHRUb2tlbigpKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJWZXJpZnk2MDogIiArIGxpc3QudG9TdHJpbmcoKSk7Ci0JCQl2ZXJpZnk2MCA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHZlcmlmeTYwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGluc3RhbGxhdGlvbiB2ZXJpZmljYXRpb24gcHJvcGVydGllcyIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gdmVyaWZ5IGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHNwZWNpZmllZCBzZXJ2ZXIgSUQuICBUaGUgdmVyaWZpY2F0aW9uIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBpbnN0YWxsYXRpb24KLQkgKiBkaXJlY3RvcnkgbmFtZSB0byBzZWUgaWYgaXQgaW5kaWNhdGVzIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgVG9tY2F0LgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YWxsUGF0aCBQYXRoIHRvIHZlcmlmeQotCSAqIEBwYXJhbSBpZCBUeXBlIElEIG9mIHRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uLiAgV2lsbCBiZSBTdGF0dXMuT0tfU1RBVFVTLCBpZiB2ZXJpZmljYXRpb24KLQkgKiAgICB3YXMgc3VjY2Vzc2Z1bCwgb3IgZXJyb3Igc3RhdHVzIGlmIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGhXaXRoRm9sZGVyQ2hlY2soSVBhdGggaW5zdGFsbFBhdGgsIFN0cmluZyBpZCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHZlcmlmeVRvbWNhdFZlcnNpb25Gcm9tUGF0aChpbnN0YWxsUGF0aCwgaWQpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJc3RhdHVzID0gdmVyaWZ5SW5zdGFsbFBhdGgoaW5zdGFsbFBhdGgsIGlkKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFZlcmlmeSB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIFBhdGggdG8gdmVyaWZ5Ci0JICogQHBhcmFtIGlkIFR5cGUgSUQgb2YgdGhlIHNlcnZlcgotCSAqIEByZXR1cm4gU3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24uICBXaWxsIGJlIFN0YXR1cy5PS19TVEFUVVMsIGlmIHZlcmlmaWNhdGlvbgotCSAqICAgIHdhcyBzdWNjZXNzZnVsLCBvciBlcnJvciBzdGF0dXMgaWYgbm90LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCBpbnN0YWxsUGF0aCwgU3RyaW5nIGlkKSB7Ci0JCWlmIChpbnN0YWxsUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5SW5zdGFsbERpclN0YXR1czsKLQkJCi0JCVN0cmluZyBkaXIgPSBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCk7Ci0JCWlmIChkaXIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZW1wdHlJbnN0YWxsRGlyU3RhdHVzOwotCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBpbnN0YWxsRGlyRG9lc05vdEV4aXN0OwotCi0JCWlmICghZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCWRpciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCi0JCS8vIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi0JCVRvbWNhdFBsdWdpbi5sb2FkVmVyaWZ5RmlsZXMoKTsKLQkJCi0JCVZlcmlmeVJlc291cmNlU3BlY1tdIHNwZWNzID0gbnVsbDsKLQkJaWYgKFRPTUNBVF8zMi5lcXVhbHMoaWQpKQotCQkJc3BlY3MgPSB2ZXJpZnkzMjsKLQkJZWxzZSBpZiAoVE9NQ0FUXzQwLmVxdWFscyhpZCkpCi0JCQlzcGVjcyA9IHZlcmlmeTQwOwotCQllbHNlIGlmIChUT01DQVRfNDEuZXF1YWxzKGlkKSkKLQkJCXNwZWNzID0gdmVyaWZ5NDE7Ci0JCWVsc2UgaWYgKFRPTUNBVF81MC5lcXVhbHMoaWQpKQotCQkJc3BlY3MgPSB2ZXJpZnk1MDsKLQkJZWxzZSBpZiAoVE9NQ0FUXzU1LmVxdWFscyhpZCkpIHsKLQkJCXNwZWNzID0gdmVyaWZ5NTU7Ci0JCX0KLQkJZWxzZSBpZiAoVE9NQ0FUXzYwLmVxdWFscyhpZCkpIHsKLQkJCXNwZWNzID0gdmVyaWZ5NjA7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JVbmtub3duVmVyc2lvbiwgbnVsbCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwZWNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWZXJpZnlSZXNvdXJjZVNwZWMgZnMgPSBzcGVjc1tpXTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZnMuY2hlY2tSZXNvdXJjZShkaXIpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmVyaWZ5VG9tY2F0VmVyc2lvbkZyb21QYXRoKElQYXRoIGluc3RhbGxQYXRoLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodmVyc2lvbiA9PSBudWxsKSAKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yVmVyc2lvbkVtcHR5LCBudWxsKTsKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlJbnN0YWxsRGlyU3RhdHVzOwotCi0JCVN0cmluZyBzID0gaW5zdGFsbFBhdGgubGFzdFNlZ21lbnQoKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAocy5pbmRleE9mKCItMy4yIikgPiAwIHx8IHMuaW5kZXhPZigiIDMuMiIpID4gMCkKLQkJCXJldHVybiBUT01DQVRfMzIuZXF1YWxzKHZlcnNpb24pID8gU3RhdHVzLk9LX1NUQVRVUyA6IHdyb25nRGlyVmVyc2lvblN0YXR1czsKLQkJaWYgKHMuaW5kZXhPZigiLTQuMCIpID4gMCB8fCBzLmluZGV4T2YoIiA0LjAiKSA+IDApCi0JCQlyZXR1cm4gVE9NQ0FUXzQwLmVxdWFscyh2ZXJzaW9uKSA/IFN0YXR1cy5PS19TVEFUVVMgOiB3cm9uZ0RpclZlcnNpb25TdGF0dXM7Ci0JCWlmIChzLmluZGV4T2YoIi00LjEiKSA+IDAgfHwgcy5pbmRleE9mKCIgNC4xIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF80MS5lcXVhbHModmVyc2lvbikgPyBTdGF0dXMuT0tfU1RBVFVTIDogd3JvbmdEaXJWZXJzaW9uU3RhdHVzOwotCQlpZiAocy5pbmRleE9mKCItNS4wIikgPiAwIHx8IHMuaW5kZXhPZigiIDUuMCIpID4gMCkKLQkJCXJldHVybiBUT01DQVRfNTAuZXF1YWxzKHZlcnNpb24pID8gU3RhdHVzLk9LX1NUQVRVUyA6IHdyb25nRGlyVmVyc2lvblN0YXR1czsKLQkJaWYgKHMuaW5kZXhPZigiLTUuNSIpID4gMCB8fCBzLmluZGV4T2YoIiA1LjUiKSA+IDApCi0JCQlyZXR1cm4gVE9NQ0FUXzU1LmVxdWFscyh2ZXJzaW9uKSA/IFN0YXR1cy5PS19TVEFUVVMgOiB3cm9uZ0RpclZlcnNpb25TdGF0dXM7Ci0JCWlmIChzLmluZGV4T2YoIi02LjAiKSA+IDAgfHwgcy5pbmRleE9mKCIgNi4wIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF82MC5lcXVhbHModmVyc2lvbikgPyBTdGF0dXMuT0tfU1RBVFVTIDogd3JvbmdEaXJWZXJzaW9uU3RhdHVzOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSA8Y29kZT5qYXZhLmlvLkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiA8Y29kZT5JUGF0aDwvY29kZT4gaW4gdGhlIHBsdWdpbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZ2V0UGx1Z2luKCkgewotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVUkwgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCQlVUkwgbG9jYWxVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoaW5zdGFsbFVSTCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQdWJsaXNoTW9kdWxlVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQdWJsaXNoTW9kdWxlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjE3Nzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSWdvciBGZWRvcmVua28gJiBGYWJyaXppbyBHaXVzdGluYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC53c3QuSU1vZHVsZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLS8qKgotICogSGFuZGxlcyAicHVibGlzaGluZyIgZm9yIHNlcnZlcnMgdGhhdCBjYW4gbG9hZCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZGlyZWN0bHkKLSAqIGZyb20gdGhlIHdvcmtzcGFjZS4gSW5zdGVhZCBvZiBjcmVhdGluZyBhbmQgZGVwbG95aW5nIGphcnMgdG8gdGhlIHdlYmFwcCB0aGlzCi0gKiBzaW1wbHkgdXBkYXRlIHRoZSB2aXJ0dWFsIGNsYXNzcGF0aCBpbiB0aGUgY29udGV4dCB4bWwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFB1Ymxpc2hNb2R1bGVWaXNpdG9yIGltcGxlbWVudHMgSU1vZHVsZVZpc2l0b3IgewotCi0gICAgLyoqCi0gICAgICogU2VydmVyIGJhc2UgcGF0aCAoQ2F0YWxpbmEgYmFzZSkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIElQYXRoIGJhc2VEaXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmVyIGluc3RhbmNlIGluIHdoaWNoIHRvIG1vZGlmeSB0aGUgY29udGV4dAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJJbnN0YW5jZSBzZXJ2ZXJJbnN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIENhdGFsaW5hLnByb3BlcnRpZXMgbG9hZGVyIHRvIGFkZCBnbG9iYWwgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHNoYXJlZExvYWRlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGFzc3BhdGggZW50cmllcyBhZGRlZCBieSBlYXIgY29uZmlndXJhdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3QgZWFyQ29tbW9uUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBjbGFzc3BhdGggZWxlbWVudHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGN1c3RvbSB0b21jYXQgbG9hZGVyLgotICAgICAqIFRoaXMgc2V0IHNob3VsZCBpbmNsdWRlIGFueSBjbGFzcyBkaXIgZnJvbSByZWZlcmVuY2VkIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldCB2aXJ0dWFsQ2xhc3NDbGFzc3BhdGhFbGVtZW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgcHJvdGVjdGVkIFNldCB2aXJ0dWFsSmFyQ2xhc3NwYXRoRWxlbWVudHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGUgYSBuZXcgVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0YWxpbmFCYXNlIGNhdGFsaW5hIGJhc2UgcGF0aAotICAgICAqLwotICAgIFRvbWNhdFB1Ymxpc2hNb2R1bGVWaXNpdG9yKElQYXRoIGNhdGFsaW5hQmFzZSwgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2UsIFN0cmluZyBzaGFyZWRMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5iYXNlRGlyID0gY2F0YWxpbmFCYXNlOwotICAgICAgICB0aGlzLnNlcnZlckluc3RhbmNlID0gc2VydmVySW5zdGFuY2U7Ci0gICAgICAgIHRoaXMuc2hhcmVkTG9hZGVyID0gc2hhcmVkTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSU1vZHVsZVZpc2l0b3IjdmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvLCBldmVyeXRoaW5nIGlzIGRvbmUgaW4gZW5kVmlzaXRXZWJDb21wb25lbnQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNb2R1bGVWaXNpdG9yI3Zpc2l0QXJjaGl2ZUNvbXBvbmVudChJUGF0aCwgSVBhdGgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXRBcmNoaXZlQ29tcG9uZW50KElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0gICAgICAgIGFkZFZpcnR1YWxKYXJSZXNvdXJjZShydW50aW1lUGF0aCwgd29ya3NwYWNlUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTW9kdWxlVmlzaXRvciN2aXNpdERlcGVuZGVudENvbXBvbmVudChJUGF0aCwgSVBhdGgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXREZXBlbmRlbnRDb21wb25lbnQoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLSAgICAgICAgYWRkVmlydHVhbEphclJlc291cmNlKHJ1bnRpbWVQYXRoLCB3b3Jrc3BhY2VQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNb2R1bGVWaXNpdG9yI3Zpc2l0V2ViUmVzb3VyY2UoSVBhdGgsIElQYXRoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0V2ViUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLSAgICAgICAgYWRkVmlydHVhbENsYXNzUmVzb3VyY2UocnVudGltZVBhdGgsIHdvcmtzcGFjZVBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSU1vZHVsZVZpc2l0b3IjdmlzaXRFYXJSZXNvdXJjZShJUGF0aCwgSVBhdGgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXRFYXJSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCkgewotICAgICAgICBlYXJDb21tb25SZXNvdXJjZXMuYWRkKHdvcmtzcGFjZVBhdGgudG9PU1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNb2R1bGVWaXNpdG9yI2VuZFZpc2l0RWFyQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFZpc2l0RWFyQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVhckNvbW1vblJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENhdGFsaW5hUHJvcGVydGllc1V0aWwuYWRkR2xvYmFsQ2xhc3NwYXRoKGJhc2VEaXIuYXBwZW5kKAotICAgICAgICAgICAgICAgIAkJImNvbmYvY2F0YWxpbmEucHJvcGVydGllcyIpLnRvRmlsZSgpLCBzaGFyZWRMb2FkZXIsCi0gICAgICAgICAgICAgICAgCQkoU3RyaW5nW10pIGVhckNvbW1vblJlc291cmNlcy50b0FycmF5KG5ldyBTdHJpbmdbZWFyQ29tbW9uUmVzb3VyY2VzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiVW5hYmxlIHRvIGFkZCBlYXIgcGF0aCBlbnRyaWVzIHRvIGNhdGFsaW5hLnByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgZWFyQ29tbW9uUmVzb3VyY2VzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kVmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vIHRyYWNrIGNvbnRleHQgY2hhbmdlcywgZG9uJ3QgcmV3cml0ZSBpZiBub3QgbmVlZGVkCi0gICAgICAgIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQotICAgICAgICBJTW9kdWxlIG1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdGhpcyBmb3IgdGhlIHVzZXItc3BlY2lmaWVkIGNvbnRleHQgcGF0aAotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBmaW5kQ29udGV4dChtb2R1bGUpOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgIAlTdHJpbmcgbmFtZSA9IG1vZHVsZSAhPSBudWxsID8gbW9kdWxlLmdldE5hbWUoKSA6IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZmluZCBjb250ZXh0IGZvciBtb2R1bGUgIiArIG5hbWUpOwotICAgIAkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotICAgIAkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb250ZXh0Tm90Rm91bmQsIG5hbWUpLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIHJlbG9hZGFibGUgPSB0cnVlOwotCi0gICAgICAgIGNvbnRleHROYW1lID0gY29udGV4dC5nZXRQYXRoKCk7Ci0gICAgICAgIHJlbG9hZGFibGUgPSBCb29sZWFuLnZhbHVlT2YoY29udGV4dC5nZXRSZWxvYWRhYmxlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgIC8vIG5vdyBzdHJpcCBpbml0aWFsIC8KLSAgICAgICAgaWYgKGNvbnRleHROYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb250ZXh0TmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByb290IGNvbnRleHQgaXMgZGVwbG95ZWQgd2l0aCB0aGUgIlJPT1QiIG5hbWUgaW4gdG9tY2F0Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udGV4dE5hbWUpKSB7Ci0gICAgICAgICAgICBjb250ZXh0TmFtZSA9ICJST09UIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBwcm9qZWN0IGNvbnRleHQueG1sCi0gICAgICAgIENvbnRleHQgcHJvamVjdENvbnRleHQgPSBnZXRQcm9qZWN0Q29udGV4dFhtbChjb21wb25lbnQpOwotCi0gICAgICAgIGlmIChwcm9qZWN0Q29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjb3B5IGNvbmZpZ3VyYXRpb24gdG8gc2VydmVyIGNvbnRleHQKLSAgICAgICAgICAgIHByb2plY3RDb250ZXh0LmNvcHlDaGlsZHJlblRvKGNvbnRleHQpOwotCi0gICAgICAgICAgICBNYXAgYXR0cnMgPSBwcm9qZWN0Q29udGV4dC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhdGgiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG9jQmFzZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzb3VyY2UiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBhdHRycy5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxWYWx1ZSA9IGNvbnRleHQuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKGFjdHVhbFZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgY2hhbmdlcyBpbiBkb2NCYXNlCi0gICAgICAgIFN0cmluZyBkb2NCYXNlID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgIGlmICghZG9jQmFzZS5lcXVhbHMoY29udGV4dC5nZXREb2NCYXNlKCkpKSB7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoZG9jQmFzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgY2hhbmdlcyBpbiByZWxvYWRhYmxlIGZsYWcKLSAgICAgICAgaWYgKHJlbG9hZGFibGUgIT0gKEJvb2xlYW4udmFsdWVPZigoY29udGV4dC5nZXRSZWxvYWRhYmxlKCkpKQotICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0UmVsb2FkYWJsZShCb29sZWFuLnRvU3RyaW5nKHJlbG9hZGFibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYXRoID0gKGNvbnRleHROYW1lLmVxdWFscygiUk9PVCIpID8gIiIgOiAiLyIgKyBjb250ZXh0TmFtZSk7Ci0gICAgICAgIC8vIGhhbmRsZSBjaGFuZ2VzIGluIHRoZSBwYXRoCi0gICAgICAgIC8vIFBBVEggaXMgcmVxdWlyZWQgZm9yIHRvbWNhdCA1LjAsIGJ1dCBpZ25vcmVkIGluIHRvbWNhdCA1LjUKLSAgICAgICAgaWYgKCFwYXRoLmVxdWFscyhjb250ZXh0LmdldFBhdGgoKSkpIHsKLSAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0aChwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuc2V0Q2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5sb2FkZXIuV3RwRGlyQ29udGV4dCIpOwotCi0gICAgICAgIExvYWRlciBsb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpOwotCi0gICAgICAgIGxvYWRlci5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmxvYWRlci5XdHBXZWJhcHBMb2FkZXIiKTsKLQotICAgICAgICAvLyByZXF1aXJlZCBmb3IgdG9tY2F0IDUuNS4yMCBkdWUgdG8gdGhlIGNoYW5nZSBpbgotICAgICAgICAvLyBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM5NzA0Ci0gICAgICAgIGxvYWRlci5zZXRVc2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50KEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgZG93biB0aGUgdmlydHVhbCBjbGFzc1BhdGgKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHZpcnR1YWxDbGFzc0NsYXNzcGF0aEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIAkJaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCAmJiB2aXJ0dWFsSmFyQ2xhc3NwYXRoRWxlbWVudHMuc2l6ZSgpID4gMCkgewotICAgICAgICAJYnVmZmVyLmFwcGVuZCgiOyIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2aXJ0dWFsSmFyQ2xhc3NwYXRoRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgCQlpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIAlidWZmZXIuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIAlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJYnVmZmVyLmFwcGVuZCgiOyIpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWxDbGFzc0NsYXNzcGF0aEVsZW1lbnRzLmNsZWFyKCk7Ci0gICAgICAgIHZpcnR1YWxKYXJDbGFzc3BhdGhFbGVtZW50cy5jbGVhcigpOwotCi0gICAgICAgIFN0cmluZyB2Y3AgPSBidWZmZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmcgb2xkVmNwID0gbG9hZGVyLmdldFZpcnR1YWxDbGFzc3BhdGgoKTsKLQotICAgICAgICBpZiAoIXZjcC5lcXVhbHMob2xkVmNwKSkgewotICAgICAgICAgICAgLy8gc2F2ZSBvbmx5IGlmIG5lZWRlZAotICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgbG9hZGVyLnNldFZpcnR1YWxDbGFzc3BhdGgodmNwKTsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuc2V0VmlydHVhbENsYXNzcGF0aCh2Y3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpcnR5KSB7Ci0gICAgICAgIAkvL1RPRE8gSWYgd3JpdGluZyB0byBzZXBhcmF0ZSBjb250ZXh0IFhNTCBmaWxlcywgc2F2ZSAiZGlydHkiIHN0YXR1cyBmb3IgbGF0ZXIgdXNlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVmlydHVhbENsYXNzUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLSAgICAgICAgdmlydHVhbENsYXNzQ2xhc3NwYXRoRWxlbWVudHMuYWRkKHdvcmtzcGFjZVBhdGgudG9PU1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVmlydHVhbEphclJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0gICAgICAgIHZpcnR1YWxKYXJDbGFzc3BhdGhFbGVtZW50cy5hZGQod29ya3NwYWNlUGF0aC50b09TU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkIGEgTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZSBmcm9tIHByb2plY3QsIGlmIGF2YWlsYWJsZQotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnQgd2ViIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBjb250ZXh0LnhtbAotICAgICAqIEByZXR1cm4gY29udGV4dCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNvbnRleHQueG1sCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRleHQgZ2V0UHJvamVjdENvbnRleHRYbWwoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGxvYWQgb3IgY3JlYXRlIG1vZHVsZSdzIGNvbnRleHQueG1sIGRvY3VtZW50Ci0gICAgICAgIElWaXJ0dWFsRmlsZSBjb250ZXh0RmlsZSA9IChJVmlydHVhbEZpbGUpIGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkKLSAgICAgICAgICAgICAgICAuZmluZE1lbWJlcigiTUVUQS1JTkYvY29udGV4dC54bWwiKTsKLQotICAgICAgICBDb250ZXh0IGNvbnRleHRFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICBpZiAoY29udGV4dEZpbGUgIT0gbnVsbCAmJiBjb250ZXh0RmlsZS5leGlzdHMoKSkgewotCi0gICAgICAgICAgICBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmlzID0gY29udGV4dEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgICAgIGNvbnRleHRFbGVtZW50ID0gKENvbnRleHQpIGZhY3RvcnkubG9hZERvY3VtZW50KGZpcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkV4Y2VwdGlvbiByZWFkaW5nICIgKyBjb250ZXh0RmlsZSwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBtb2R1bGUgZnJvbSB0aGUgY29uZmlnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0gICAgICogQHJldHVybiBhIHdlYiBtb2R1bGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBmaW5kQ29udGV4dChJTW9kdWxlIG1vZHVsZSkgewotICAgICAgICBpZiAobW9kdWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IG1vZHVsZS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCWlmIChzb3VyY2UuZXF1YWxzKGNvbnRleHRzW2ldLmdldFNvdXJjZSgpKSkKLSAgICAgICAgCQlyZXR1cm4gY29udGV4dHNbaV07Ci0JCX0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYzdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5MYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSVRvbWNhdFJ1bnRpbWUsIElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwotCQotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHNka01hcCA9IG5ldyBIYXNoTWFwKDIpOwotCi0JcHVibGljIFRvbWNhdFJ1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIGdldFZlcnNpb25IYW5kbGVyKCkgewotCQlJUnVudGltZVR5cGUgdHlwZSA9IGdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpOwotCQlyZXR1cm4gVG9tY2F0UGx1Z2luLmdldFRvbWNhdFZlcnNpb25IYW5kbGVyKHR5cGUuZ2V0SWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxUeXBlSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKGdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZSA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJU3RyaW5nIGlkID0gZ2V0Vk1JbnN0YWxsSWQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyh2bUluc3RhbGxzW2ldLmdldElkKCkpKQotCQkJCQlyZXR1cm4gdm1JbnN0YWxsc1tpXTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoKSB7Ci0JCUlQYXRoIGluc3RhbGxQYXRoID0gZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7Ci0JCS8vIElmIGluc3RhbGxQYXRoIGlzIHJlbGF0aXZlLCBjb252ZXJ0IHRvIGNhbm9uaWNhbCBwYXRoIGFuZCBob3BlIGZvciB0aGUgYmVzdAotCQlpZiAoIWluc3RhbGxQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaW5zdGFsbExvYyA9IChuZXcgRmlsZShpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJaW5zdGFsbFBhdGggPSBuZXcgUGF0aChpbnN0YWxsTG9jKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZUNsYXNzcGF0aChpbnN0YWxsUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBJZiBpdCBpcwotCSAqIGNvcnJlY3QsIHRydWUgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIHVzZXIgaXMgbm90aWZpZWQKLQkgKiBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5TG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uSGFuZGxlcigpLnZlcmlmeUluc3RhbGxQYXRoKGdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgcnVudGltZQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCi0JCXN0YXR1cyA9IHZlcmlmeUxvY2F0aW9uKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0vLwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpciwgbnVsbCk7Ci0JCS8vIGRvbid0IGFjY2VwdCB0cmFpbGluZyBzcGFjZSBzaW5jZSB0aGF0IGNhbiBjYXVzZSBzdGFydHVwIHByb2JsZW1zCi0JCWlmIChnZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKS5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyVHJhaWxpbmdTbGFzaCwgbnVsbCk7Ci0JCWlmIChnZXRWTUluc3RhbGwoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCi0JCS8vIGNoZWNrIGZvciB0b29scy5qYXIgKGNvbnRhaW5zIHRoZSBqYXZhYyBjb21waWxlciBvbiBXaW5kb3dzICYgTGludXgpIHRvIHNlZSB3aGV0aGVyCi0JCS8vIFRvbWNhdCB3aWxsIGJlIGFibGUgdG8gY29tcGlsZSBKU1BzLgotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUZpbGUgZmlsZSA9IGdldFZNSW5zdGFsbCgpLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlGaWxlIHRvb2xzSmFyID0gbmV3IEZpbGUoZmlsZSwgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJ0b29scy5qYXIiKTsKLQkJCWlmICh0b29sc0phci5leGlzdHMoKSkKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCX0KLQkJCi0JCS8vIG9uIFRvbWNhdCA1LjUgYW5kIDYuMCwgdGhlIEVjbGlwc2UgSkRUIGNvbXBpbGVyIGlzIHVzZWQgZm9yIEpTUCdzCi0JCVN0cmluZyBpZCA9IGdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCWlmICghZm91bmQpIHsKLQkJCWlmIChpZCAhPSBudWxsICYmIChpZC5pbmRleE9mKCI1NSIpID4gMCB8fCBpZC5pbmRleE9mKCI2MCIpID4gMCkpCi0JCQkJZm91bmQgPSB0cnVlOwotCQl9Ci0JCQotCQkvLyBvbiBNYWMsIHRvb2xzLmphciBpcyBtZXJnZWQgaW50byBjbGFzc2VzLnppcC4gaWYgdG9vbHMuamFyIHdhc24ndCBmb3VuZCwKLQkJLy8gdHJ5IGxvYWRpbmcgdGhlIGphdmFjIGNsYXNzIGJ5IHJ1bm5pbmcgYSBjaGVjayBpbnNpZGUgdGhlIFZNCi0JCWlmICghZm91bmQpIHsKLQkJCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCQlpZiAob3MgIT0gbnVsbCAmJiBvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIm1hYyIpID49IDApCi0JCQkJZm91bmQgPSBjaGVja0ZvckNvbXBpbGVyKCk7Ci0JCX0KLQkJCi0JCWlmICghZm91bmQpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLndhcm5pbmdKUkUsIG51bGwpOwotCQkKLQkJRmlsZSBmID0gZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCUZpbGVbXSBjb25mID0gZi5saXN0RmlsZXMoKTsKLQkJaWYgKGNvbmYgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjb25mLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCFmLmNhblJlYWQoKSkKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy53YXJuaW5nQ2FudFJlYWRDb25maWcsIG51bGwpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBGb3IgVG9tY2F0IDYuMCwgZW5zdXJlIHdlIGhhdmUgSjJTRSA1LjAKLQkJaWYgKGlkICE9IG51bGwgJiYgaWQuaW5kZXhPZigiNjAiKSA+IDApIHsKLQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gZ2V0Vk1JbnN0YWxsKCk7Ci0JCQlpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLQkJCQlTdHJpbmcgamF2YVZlcnNpb24gPSAoKElWTUluc3RhbGwyKXZtSW5zdGFsbCkuZ2V0SmF2YVZlcnNpb24oKTsKLQkJCQlpZiAoamF2YVZlcnNpb24gIT0gbnVsbCAmJiBqYXZhVmVyc2lvbi5jb21wYXJlVG8oIjEuNSIpIDwgMCkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckpSRVRvbWNhdDYwLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3NldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlSdW50aW1lVHlwZSB0eXBlID0gZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuZ2V0UnVudGltZVR5cGUoKTsKLQkJZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2V0TG9jYXRpb24obmV3IFBhdGgoVG9tY2F0UGx1Z2luLmdldFByZWZlcmVuY2UoImxvY2F0aW9uIiArIHR5cGUuZ2V0SWQoKSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpIHsKLQkJaWYgKHZtSW5zdGFsbCA9PSBudWxsKSB7Ci0JCQlzZXRWTUluc3RhbGwobnVsbCwgbnVsbCk7Ci0JCX0gZWxzZQotCQkJc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSwgdm1JbnN0YWxsLmdldElkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgSmF2YSBjb21waWxlciBpbiB0aGUgZ2l2ZW4gamF2YQotCSAqIGV4ZWN1dGFibGUuIEEgbWFpbiBwcm9ncmFtIGlzIHJ1biAoPGNvZGU+b3JnLmVjbGlwc2UuanN0LnRvbWNhdC5jb3JlLgotCSAqIGludGVybmFsLkNsYXNzRGV0ZWN0b3I8L2NvZGU+KSwgdGhhdCBkdW1wcyBhIHRydWUgb3IgZmFsc2UgdmFsdWUKLQkgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29tcGlsZXIgaXMgZm91bmQuIFRoaXMgb3V0cHV0IGlzIHRoZW4KLQkgKiBwYXJzZWQgYW5kIGNhY2hlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGVyIHdhcyBmb3VuZAotCSAqLwkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ZvckNvbXBpbGVyKCkgewotCQkvLyBmaXJzdCB0cnkgdGhlIGNhY2hlCi0JCUZpbGUgamF2YUhvbWUgPSBnZXRWTUluc3RhbGwoKS5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBzZGtNYXAuZ2V0KGphdmFIb21lKTsKLQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQkvLyBsb2NhdGUgdG9tY2F0Y29yZS5qYXIgLSBpdCBjb250YWlucyB0aGUgY2xhc3MgZGV0ZWN0b3IgbWFpbiBwcm9ncmFtCi0JCUZpbGUgZmlsZSA9IFRvbWNhdFBsdWdpbi5nZXRQbHVnaW4oKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQlJVk1SdW5uZXIgdm1SdW5uZXIgPSBnZXRWTUluc3RhbGwoKS5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCQlWTVJ1bm5lckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbigib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5DbGFzc0RldGVjdG9yIiwgbmV3IFN0cmluZ1tdIHsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KTsKLQkJCWNvbmZpZy5zZXRQcm9ncmFtQXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7ICJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iIH0pOwotCQkJSUxhdW5jaCBsYXVuY2ggPSBuZXcgTGF1bmNoKG51bGwsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKLQkJCXRyeSB7Ci0JCQkJdm1SdW5uZXIucnVuKGNvbmZpZywgbGF1bmNoLCBudWxsKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDYwMDsgaSsrKSB7Ci0JCQkJCS8vIHdhaXQgbm8gbW9yZSB0aGFuIDMwIHNlY29uZHMgKDYwMCAqIDUwIG1pbHMpCi0JCQkJCWlmIChsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoNTApOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCQlJU3RyZWFtc1Byb3h5IHN0cmVhbXNQcm94eSA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKVswXS5nZXRTdHJlYW1zUHJveHkoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHN0cmVhbXNQcm94eSAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBzdHJlYW1zUHJveHkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0JCQkJCi0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCWlmICgidHJ1ZSIuZXF1YWxzKHRleHQpKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQotCQkJCQkJc2RrTWFwLnB1dChqYXZhSG9tZSwgbmV3IEJvb2xlYW4oZm91bmQpKTsKLQkJCQkJCXJldHVybiBmb3VuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2hlY2tpbmcgZm9yIEpESyIsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIWxhdW5jaC5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBsb2cgZXJyb3IgdGhhdCB3ZSB3ZXJlIHVuYWJsZSB0byBjaGVjayBmb3IgdGhlIGNvbXBpbGVyCi0JCVRvbWNhdFBsdWdpbi5sb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkZhaWxlZCBjb21waWxlciBjaGVjayBmb3IgezB9IiwgbmV3IFN0cmluZ1tdIHsgamF2YUhvbWUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjY0OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiBDbGFzc3BhdGggcHJvdmlkZXIgZm9yIHRoZSBUb21jYXQgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVByb2plY3QsIElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSVBhdGggaW5zdGFsbFBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0JCQotCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgcnVudGltZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCWlmIChydW50aW1lSWQuaW5kZXhPZigiMzIiKSA+IDApIHsKLQkJCUlQYXRoIHBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpOwotCQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgcGF0aC50b0ZpbGUoKSwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAocnVudGltZUlkLmluZGV4T2YoIjYwIikgPiAwKSB7Ci0JCQkvLyBUT0RPIE1heSBuZWVkIHNvbWUgZmxleGliaWxpdHkgaW4gY2FzZSB0aGUgaW5zdGFsbGF0aW9uIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkKLQkJCS8vIFRoaXMgbGliICJzaW1wbGlmaWNhdGlvbiIgbWF5IGNhdXNlIGlzc3VlcyBmb3Igc29tZS4KLQkJCS8vIE5vdCBrbm93biB5ZXQgd2hldGhlciBwYWNrYWdlZCBMaW51eCBpbnN0YWxscyB3aWxsIGdvIGFsb25nLgotCQkJSVBhdGggcGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgibGliIik7Ci0JCQlhZGRMaWJyYXJ5RW50cmllcyhsaXN0LCBwYXRoLnRvRmlsZSgpLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpOwotCQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgcGF0aC5hcHBlbmQoImxpYiIpLnRvRmlsZSgpLCB0cnVlKTsKLQkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGguYXBwZW5kKCJlbmRvcnNlZCIpLnRvRmlsZSgpLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKWxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE0YTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lTG9jYXRvciBleHRlbmRzIFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gcnVudGltZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsKLQkJIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiLAotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIsCi0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIiwKLQkJIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiLAotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSIsCi0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIn07Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVJ1bnRpbWVGYWN0b3J5RGVsZWdhdGUjZ2V0S25vd25SdW50aW1lcygpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoRm9yUnVudGltZXMoSVBhdGggcGF0aCwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlYXJjaEZvclJ1bnRpbWVzMihwYXRoLCBsaXN0ZW5lciwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzMihJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJRmlsZSBmID0gcGF0aC50b0ZpbGUoKTsKLQkJCWlmIChmLmV4aXN0cygpKQotCQkJCWZpbGVzID0gZi5saXN0RmlsZXMoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZQotCQkJZmlsZXMgPSBGaWxlLmxpc3RSb290cygpOwotCi0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCWludCB3b3JrID0gMTAwIC8gc2l6ZTsKLQkJCWludCB3b3JrTGVmdCA9IDEwMCAtICh3b3JrICogc2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChmaWxlc1tpXSAhPSBudWxsICYmIGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCXNlYXJjaERpcihsaXN0ZW5lciwgZmlsZXNbaV0sIDQsIG1vbml0b3IpOwotCQkJCW1vbml0b3Iud29ya2VkKHdvcmspOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQod29ya0xlZnQpOwotCQl9IGVsc2UKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaERpcihJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBGaWxlIGRpciwgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCJjb25mIi5lcXVhbHMoZGlyLmdldE5hbWUoKSkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IGdldFJ1bnRpbWVGcm9tRGlyKGRpci5nZXRQYXJlbnRGaWxlKCksIG1vbml0b3IpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWxpc3RlbmVyLnJ1bnRpbWVGb3VuZChydW50aW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZXB0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9KTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlzZWFyY2hEaXIobGlzdGVuZXIsIGZpbGVzW2ldLCBkZXB0aCAtIDEsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZVdvcmtpbmdDb3B5IGdldFJ1bnRpbWVGcm9tRGlyKEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVzW2ldKTsKLQkJCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyBpZCA9IGFic29sdXRlUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnXycpLnJlcGxhY2UoJzonLCctJyk7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShpZCwgbW9uaXRvcik7Ci0JCQkJcnVudGltZS5zZXROYW1lKGRpci5nZXROYW1lKCkpOwotCQkJCXJ1bnRpbWUuc2V0TG9jYXRpb24obmV3IFBhdGgoYWJzb2x1dGVQYXRoKSk7Ci0JCQkJSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lLmxvYWRBZGFwdGVyKElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQkJCXdjLnNldFZNSW5zdGFsbChKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCkpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZS52YWxpZGF0ZShtb25pdG9yKTsKLQkJCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJcmV0dXJuIHJ1bnRpbWU7Ci0JCQkJCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJGYWxzZSBydW50aW1lIGZvdW5kIGF0ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiOiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHJ1bnRpbWUiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0ODhiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5GYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkoyRUVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKLS8qKgotICogR2VuZXJpYyBUb21jYXQgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyIGV4dGVuZHMgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVG9tY2F0U2VydmVyLCBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NFQ1VSRSA9ICJzZWN1cmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFQlVHID0gImRlYnVnIjsKLQotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgdmVyc2lvbkhhbmRsZXI7Ci0KLQkvKioKLQkgKiBUb21jYXRTZXJ2ZXIuCi0JICovCi0JcHVibGljIFRvbWNhdFNlcnZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFRvbWNhdCBydW50aW1lIGZvciB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRvbWNhdCBydW50aW1lIGZvciB0aGlzIHNlcnZlcgotCSAqLwotCXB1YmxpYyBUb21jYXRSdW50aW1lIGdldFRvbWNhdFJ1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChUb21jYXRSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVG9tY2F0UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVG9tY2F0IHZlcnNpb24gaGFuZGxlciBmb3IgdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB2ZXJzaW9uIGhhbmRsZXIgZm9yIHRoaXMgc2VydmVyCi0JICovCi0JcHVibGljIElUb21jYXRWZXJzaW9uSGFuZGxlciBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpIHsKLQkJaWYgKHZlcnNpb25IYW5kbGVyID09IG51bGwpIHsKLQkJCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCB8fCBnZXRUb21jYXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJdmVyc2lvbkhhbmRsZXIgPSBnZXRUb21jYXRSdW50aW1lKCkuZ2V0VmVyc2lvbkhhbmRsZXIoKTsKLQkJfQotCQlyZXR1cm4gdmVyc2lvbkhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElUb21jYXRDb25maWd1cmF0aW9uIGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRvbWNhdENvbmZpZ3VyYXRpb24gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoZm9sZGVyID09IG51bGwgfHwgIWZvbGRlci5leGlzdHMoKSkgewotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQlpZiAoZm9sZGVyICE9IG51bGwpCi0JCQkJCXBhdGggPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck5vQ29uZmlndXJhdGlvbiwgcGF0aCksIG51bGwpKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGlkID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQlpZiAoaWQuaW5kZXhPZigiMzIiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQzMkNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCWVsc2UgaWYgKGlkLmluZGV4T2YoIjQwIikgPiAwKQotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NDBDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQllbHNlIGlmIChpZC5pbmRleE9mKCI0MSIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDQxQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNTAiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ1MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCWVsc2UgaWYgKGlkLmluZGV4T2YoIjU1IikgPiAwKQotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NTVDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQllbHNlIGlmIChpZC5pbmRleE9mKCI2MCIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDYwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJdHJ5IHsKLQkJCQljb25maWd1cmF0aW9uLmxvYWQoZm9sZGVyLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoImNvbmYiKTsKLQkJCi0JCVN0cmluZyBpZCA9IGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGlkLmluZGV4T2YoIjMyIikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQzMkNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNDAiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDQwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQllbHNlIGlmIChpZC5pbmRleE9mKCI0MSIpID4gMCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NDFDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCWVsc2UgaWYgKGlkLmluZGV4T2YoIjUwIikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ1MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNTUiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDU1Q29uZmlndXJhdGlvbihmb2xkZXIpOwotCQllbHNlIGlmIChpZC5pbmRleE9mKCI2MCIpID4gMCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NjBDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCXRyeSB7Ci0JCQljb25maWd1cmF0aW9uLmltcG9ydEZyb21QYXRoKHBhdGgsIGlzVGVzdEVudmlyb25tZW50KCksIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJCWNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQkJdGhyb3cgY2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlQ29uZmlndXJhdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29uZmlndXJhdGlvbi5zYXZlKGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvbkNoYW5nZWQoKSB7Ci0JCWNvbmZpZ3VyYXRpb24gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBVUkwgb2YgdGhpcyBtb2R1bGUuCi0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlTdHJpbmcgdXJsID0gImh0dHA6Ly8iICsgZ2V0U2VydmVyKCkuZ2V0SG9zdCgpOwotCQkJaW50IHBvcnQgPSBjb25maWcuZ2V0TWFpblBvcnQoKS5nZXRQb3J0KCk7Ci0JCQlwb3J0ID0gU2VydmVyVXRpbC5nZXRNb25pdG9yZWRQb3J0KGdldFNlcnZlcigpLCBwb3J0LCAid2ViIik7Ci0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl1cmwgKz0gIjoiICsgcG9ydDsKLQkJCQotCQkJdXJsICs9IGNvbmZpZy5nZXRXZWJNb2R1bGVVUkwobW9kdWxlKTsKLQkJCQotCQkJaWYgKCF1cmwuZW5kc1dpdGgoIi8iKSkKLQkJCQl1cmwgKz0gIi8iOwotCQkJCi0JCQlyZXR1cm4gbmV3IFVSTCh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCByb290IFVSTCIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3MgaXMgc2V0IHRvIHJ1biBpbiBkZWJ1ZyBtb2RlLgotCSAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIHdpdGggVG9tY2F0IHY0LjAuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0RFQlVHLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB0ZXN0IChydW4gY29kZSBvdXQgb2YgdGhlIHdvcmtiZW5jaCkgc2VydmVyLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXN0RW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVEVTVF9FTlZJUk9OTUVOVCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpcyBzZXQgdG8gcnVuIGluIHNlY3VyZSBtb2RlLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU0VDVVJFLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFNlcnZlciNnZXRJbnN0YW5jZURpcmVjdG9yeSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9JTlNUQU5DRV9ESVIsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFNlcnZlciNnZXREZXBsb3lEaXJlY3RvcnkoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95RGlyZWN0b3J5KCkgewotCQkvLyBEZWZhdWx0IHRvIHZhbHVlIHVzZWQgYnkgcHJpb3IgV1RQIHZlcnNpb25zCi0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVQTE9ZX0RJUiwgTEVHQUNZX0RFUExPWURJUik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG1vZHVsZXMgc2hvdWxkIGJlIHNlcnZlZCB3aXRob3V0IHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJLy8gSWYgZmVhdHVyZSBpcyBzdXBwb3J0ZWQsIHJldHVybiBjdXJyZW50IHNldHRpbmcKLQkJaWYgKGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9TRVJWRV9NT0RVTEVTX1dJVEhPVVRfUFVCTElTSCwgZmFsc2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjb250ZXh0cyBzaG91bGQgYmUgc2F2ZWQgaW4gc2VwYXJhdGUgZmlsZXMKLQkgKiBkdXJpbmcgc2VydmVyIHB1Ymxpc2guCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoKSB7Ci0JCS8vIElmIGZlYXR1cmUgaXMgc3VwcG9ydGVkLCByZXR1cm4gY3VycmVudCBzZXR0aW5nCi0JCWlmIChnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLnN1cHBvcnRzU2VwYXJhdGVDb250ZXh0RmlsZXMoKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU0FWRV9TRVBBUkFURV9DT05URVhUX0ZJTEVTLCBmYWxzZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlIHJ1bnMuICBUaGlzCi0JICogcGF0aCBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24uIE51bGwgbWF5IGJlIHJldHVybmVkCi0JICogaWYgYSBydW50aW1lIGhhc24ndCBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhdGggdG8gYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIgb3IgbnVsbCBpZgotCSAqIHJ1bnRpbWUgaGFzbid0IGJlZW4gc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpIHsKLQkJSVRvbWNhdFZlcnNpb25IYW5kbGVyIHR2aCA9IGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCk7Ci0JCWlmICh0dmggIT0gbnVsbCkKLQkJCXJldHVybiB0dmguZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkodGhpcyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCBtb2R1bGVzIHNob3VsZCBiZSBkZXBsb3llZCBmb3IKLQkgKiB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgcGF0aCB0byBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSB7Ci0JCVN0cmluZyBkZXBsb3lEaXIgPSBnZXREZXBsb3lEaXJlY3RvcnkoKTsKLQkJSVBhdGggZGVwbG95UGF0aCA9IG5ldyBQYXRoKGRlcGxveURpcik7Ci0JCWlmICghZGVwbG95UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCUlQYXRoIGJhc2UgPSBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJZGVwbG95UGF0aCA9IGJhc2UuYXBwZW5kKGRlcGxveVBhdGgpOwotCQl9Ci0JCXJldHVybiBkZXBsb3lQYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZW5kZXJDb21tYW5kTGluZShTdHJpbmdbXSBjb21tYW5kTGluZSwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAoY29tbWFuZExpbmUgPT0gbnVsbCB8fCBjb21tYW5kTGluZS5sZW5ndGggPCAxKQotCQkJcmV0dXJuICIiOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKGNvbW1hbmRMaW5lWzBdKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb21tYW5kTGluZS5sZW5ndGg7IGkrKykgewotCQkJYnVmLmFwcGVuZChzZXBhcmF0b3IpOwotCQkJYnVmLmFwcGVuZChjb21tYW5kTGluZVtpXSk7Ci0JCX0JCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICogQHBhcmFtIG1vZHVsZSBtb2R1bGUgZnJvbSB3aGljaCB0byBnZXQgY2hpbGQgbW9kdWxlKHMpCi0JICogQHJldHVybiBhcnJheSBvZiBjaGlsZCBtb2R1bGUocykKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA9IG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQotCQlpZiAobW9kdWxlLmxlbmd0aCA9PSAxICYmIG1vZHVsZVR5cGUgIT0gbnVsbCAmJiAianN0LndlYiIuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpIHsKLQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpIG1vZHVsZVswXS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gd2ViTW9kdWxlLmdldE1vZHVsZXMoKTsKLQkJCQkvL2lmIChtb2R1bGVzICE9IG51bGwpCi0JCQkJLy8JU3lzdGVtLm91dC5wcmludGxuKG1vZHVsZXMubGVuZ3RoKTsKLQkJCQlyZXR1cm4gbW9kdWxlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICogQHBhcmFtIG1vZHVsZSBtb2R1bGUgZnJvbSB3aGljaCB0byBnZXQgdGhlIHJvb3QgbW9kdWxlCi0JICogQHJldHVybiByb290IG1vZHVsZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgianN0LndlYiIuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8ICFzdGF0dXMuaXNPSygpKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQlyZXR1cm4gbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9OwotCQl9Ci0JCQotCQlyZXR1cm4gSjJFRVV0aWwuZ2V0V2ViTW9kdWxlcyhtb2R1bGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotCSAqIHNlcnZlciwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKgotCSAqIEBwYXJhbSBhZGQgbW9kdWxlcwotCSAqIEBwYXJhbSByZW1vdmUgbW9kdWxlcwotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRkLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBhZGRbaV07Ci0JCQkJaWYgKCEianN0LndlYiIuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yV2ViTW9kdWxlc09ubHksIG51bGwpOwotCQkJCQotCQkJCWlmIChnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpID09IG51bGwpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTm9SdW50aW1lLCBudWxsKTsKLQkJCQkKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuY2FuQWRkTW9kdWxlKG1vZHVsZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQotCQkJCWlmIChtb2R1bGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQkJc3RhdHVzID0gRmFjZXRVdGlsLnZlcmlmeUZhY2V0cyhtb2R1bGUuZ2V0UHJvamVjdCgpLCBnZXRTZXJ2ZXIoKSk7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFNlcnZlclBvcnRbMF07Ci0JCQotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLmdldFNlcnZlclBvcnRzKCk7Ci0JCQlTZXJ2ZXJQb3J0W10gc3AgPSBuZXcgU2VydmVyUG9ydFtsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkoc3ApOwotCQkJcmV0dXJuIHNwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTZXJ2ZXJQb3J0WzBdOyAKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXRUZXN0RW52aXJvbm1lbnQodHJ1ZSk7Ci0JCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXNldHRpbmciLCAyKTsKLQkJc2V0QXR0cmlidXRlKCJhdXRvLXB1Ymxpc2gtdGltZSIsIDEpOwotCQlzZXREZXBsb3lEaXJlY3RvcnkoREVGQVVMVF9ERVBMT1lESVIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyBwcm9jZXNzIHRvIGRlYnVnIG1vZGUuIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzCi0JICogd2l0aCBUb21jYXQgdjQuMC4KLQkgKgotCSAqIEBwYXJhbSBiIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX0RFQlVHLCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgcHJvY2VzcyB0byBzZWN1cmUgbW9kZS4KLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU0VDVVJFLCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgc2VydmVyIHRvIHRlc3QgZW52aXJvbm1lbnQgbW9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVEVTVF9FTlZJUk9OTUVOVCwgYik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5I3NldEluc3RhbmNlRGlyZWN0b3J5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YW5jZURpcmVjdG9yeShTdHJpbmcgaW5zdGFuY2VEaXIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX0lOU1RBTkNFX0RJUiwgaW5zdGFuY2VEaXIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSNzZXREZXBsb3lEaXJlY3RvcnkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveURpcmVjdG9yeShTdHJpbmcgZGVwbG95RGlyKSB7Ci0JCS8vIFJlbW92ZSBhdHRyaWJ1dGUgaWYgc2V0dGluZyB0byBsZWdhY3kgdmFsdWUgYXNzdW1lZCBpbiBwcmlvciB2ZXJzaW9ucyBvZiBXVFAuCi0JCS8vIEFsbG93aW5nIHZhbHVlcyB0aGF0IGRpZmZlciBvbmx5IGluIGNhc2UgaXMgYXNraW5nIGZvciBtb3JlIHRyb3VibGUgdGhhdCBpdCBpcyB3b3J0aC4KLQkJaWYgKExFR0FDWV9ERVBMT1lESVIuZXF1YWxzSWdub3JlQ2FzZShkZXBsb3lEaXIpKQotCQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX0RFUExPWV9ESVIsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfRElSLCBkZXBsb3lEaXIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSNzZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU0VSVkVfTU9EVUxFU19XSVRIT1VUX1BVQkxJU0gsIGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5I3NldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcyhib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1NBVkVfU0VQQVJBVEVfQ09OVEVYVF9GSUxFUywgYik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJEZWxlZ2F0ZSNtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIHJlbW92ZSk7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQlUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCWlmIChhZGQgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBhZGQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZTMgPSBhZGRbaV07Ci0JCQkJSVdlYk1vZHVsZSBtb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlMy5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dFJvb3QgPSAiLyIgKyBjb250ZXh0Um9vdDsKLQkJCQlTdHJpbmcgZG9jQmFzZSA9IGNvbmZpZy5nZXREb2NCYXNlUHJlZml4KCkgKyBtb2R1bGUzLmdldE5hbWUoKTsKLQkJCQlXZWJNb2R1bGUgbW9kdWxlMiA9IG5ldyBXZWJNb2R1bGUoY29udGV4dFJvb3QsIGRvY0Jhc2UsIG1vZHVsZTMuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJY29uZmlnLmFkZFdlYk1vZHVsZSgtMSwgbW9kdWxlMik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChyZW1vdmUgIT0gbnVsbCkgewotCQkJaW50IHNpemUyID0gcmVtb3ZlLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUlNb2R1bGUgbW9kdWxlMyA9IHJlbW92ZVtqXTsKLQkJCQlTdHJpbmcgbWVtZW50byA9IG1vZHVsZTMuZ2V0SWQoKTsKLQkJCQlMaXN0IG1vZHVsZXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkuZ2V0V2ViTW9kdWxlcygpOwotCQkJCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IChXZWJNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJCQlpZiAobWVtZW50by5lcXVhbHMobW9kdWxlLmdldE1lbWVudG8oKSkpCi0JCQkJCQljb25maWcucmVtb3ZlV2ViTW9kdWxlKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvL2NvbmZpZy5zYXZlKGNvbmZpZy5nZXRGb2xkZXIoKSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVG9tY2F0U2VydmVyIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkM2MyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb2R1bGVQdWJsaXNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiBHZW5lcmljIFRvbWNhdCBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgZXh0ZW5kcyBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElUb21jYXRTZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGVQdWJsaXNoSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVE9QID0gInN0b3Atc2VydmVyIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKTVhfRVhDTFVERV9BUkdTID0gbmV3IFN0cmluZyBbXSB7Ci0JCSItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUiLAotCQkiLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9IiwKLQkJIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2w9IiwKLQkJIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9IgotCX07Ci0KLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCXByb3RlY3RlZCB0cmFuc2llbnQgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuCi0JICovCi0JcHVibGljIFRvbWNhdFNlcnZlckJlaGF2aW91cigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIFRvbWNhdFJ1bnRpbWUgZ2V0VG9tY2F0UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gKFRvbWNhdFJ1bnRpbWUpIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihUb21jYXRSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkgewotCQlyZXR1cm4gZ2V0VG9tY2F0U2VydmVyKCkuZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVG9tY2F0Q29uZmlndXJhdGlvbiBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VG9tY2F0U2VydmVyKCkuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBUb21jYXRTZXJ2ZXIgZ2V0VG9tY2F0U2VydmVyKCkgewotCQlyZXR1cm4gKFRvbWNhdFNlcnZlcikgZ2V0U2VydmVyKCkubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgY2xhc3MgbmFtZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBwYXRocyBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRUb21jYXRTZXJ2ZXIoKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbSdzIHJ1bnRpbWUgYXJndW1lbnRzIHRvIHN0YXJ0IG9yIHN0b3AuCi0JICoKLQkgKiBAcGFyYW0gc3RhcnRpbmcgdHJ1ZSBpZiBzdGFydGluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcnVudGltZSBwcm9ncmFtIGFyZ3VtZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCUlQYXRoIGNvbmZpZ1BhdGggPSBudWxsOwotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCWNvbmZpZ1BhdGggPSBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlyZXR1cm4gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKS5nZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhjb25maWdQYXRoLCBnZXRUb21jYXRTZXJ2ZXIoKS5pc0RlYnVnKCksIHN0YXJ0aW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCXJldHVybiBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoZ2V0VG9tY2F0U2VydmVyKCkuaXNEZWJ1ZygpLCBzdGFydGluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIChWTSkgYXJndW1lbnRzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBydW50aW1lIGFyZ3VtZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoKSB7Ci0JCUlQYXRoIGluc3RhbGxQYXRoID0gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7Ci0JCS8vIElmIGluc3RhbGxQYXRoIGlzIHJlbGF0aXZlLCBjb252ZXJ0IHRvIGNhbm9uaWNhbCBwYXRoIGFuZCBob3BlIGZvciB0aGUgYmVzdAotCQlpZiAoIWluc3RhbGxQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaW5zdGFsbExvYyA9IChuZXcgRmlsZShpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJaW5zdGFsbFBhdGggPSBuZXcgUGF0aChpbnN0YWxsTG9jKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0JCQl9Ci0JCX0KLQkJSVBhdGggY29uZmlnUGF0aCA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCUlQYXRoIGRlcGxveVBhdGg7Ci0JCS8vIElmIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcsIHVzZSB3b3Jrc3BhY2UgcGF0aCBhcyB0aGUgZGVwbG95IHBhdGgKLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkgewotCQkJZGVwbG95UGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQkvLyBFbHNlIG5vcm1hbCBwdWJsaXNoaW5nIGZvciBtb2R1bGVzCi0JCWVsc2UgewotCQkJZGVwbG95UGF0aCA9IGdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpOwotCQkJLy8gSWYgZGVwbG95UGF0aCBpcyByZWxhdGl2ZSwgY29udmVydCB0byBjYW5vbmljYWwgcGF0aCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKLQkJCWlmICghZGVwbG95UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZGVwbG95TG9jID0gKG5ldyBGaWxlKGRlcGxveVBhdGgudG9PU1N0cmluZygpKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQlkZXBsb3lQYXRoID0gbmV3IFBhdGgoZGVwbG95TG9jKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVZNQXJndW1lbnRzKGluc3RhbGxQYXRoLCBjb25maWdQYXRoLAotCQkJCWRlcGxveVBhdGgsIGdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKCkgewotCQlJUGF0aCBjb25maWdQYXRoID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVBvbGljeUZpbGUoY29uZmlnUGF0aCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbmRlckNvbW1hbmRMaW5lKFN0cmluZ1tdIGNvbW1hbmRMaW5lLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWlmIChjb21tYW5kTGluZSA9PSBudWxsIHx8IGNvbW1hbmRMaW5lLmxlbmd0aCA8IDEpCi0JCQlyZXR1cm4gIiI7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZExpbmVbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbW1hbmRMaW5lLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWYuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQlidWYuYXBwZW5kKGNvbW1hbmRMaW5lW2ldKTsKLQkJfQkKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NMaXN0ZW5lcihmaW5hbCBJUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCB8fCBuZXdQcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlpZiAoZXZlbnRzICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBldmVudHMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCAmJiBuZXdQcm9jZXNzLmVxdWFscyhldmVudHNbaV0uZ2V0U291cmNlKCkpICYmIGV2ZW50c1tpXS5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpIHsKLQkJCQkJCQlzdG9wSW1wbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wSW1wbCgpIHsKLQkJaWYgKHBpbmcgIT0gbnVsbCkgewotCQkJcGluZy5zdG9wKCk7Ci0JCQlwaW5nID0gbnVsbDsKLQkJfQotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQkJCXByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoU2VydmVyKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlQYXRoIGluc3RhbGxEaXIgPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJSVBhdGggY29uZkRpciA9IG51bGw7Ci0JCWlmIChnZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpKSB7Ci0JCQljb25mRGlyID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKS5wcmVwYXJlUnVudGltZURpcmVjdG9yeShjb25mRGlyKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9IGVsc2UKLQkJCWNvbmZEaXIgPSBpbnN0YWxsRGlyOwotCQlJU3RhdHVzIHN0YXR1cyA9IGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkucHJlcGFyZURlcGxveURpcmVjdG9yeShnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0KLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoU2VydmVyVGFzaywgNjAwKTsKLQkJCi0JCXN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5jbGVhbnVwU2VydmVyKGNvbmZEaXIsIGluc3RhbGxEaXIsCi0JCQkJIWdldFRvbWNhdFNlcnZlcigpLmlzU2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJc3RhdHVzID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLmJhY2t1cEFuZFB1Ymxpc2goY29uZkRpciwgIWdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDQwMCkpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJc3RhdHVzID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLmxvY2FsaXplQ29uZmlndXJhdGlvbihjb25mRGlyLCBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSwKLQkJCQlnZXRUb21jYXRTZXJ2ZXIoKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJCi0JCXNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGVUcmVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQlpZiAoZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkFEREVEIHx8IGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKQotCQkJCXNldFNlcnZlclJlc3RhcnRTdGF0ZSh0cnVlKTsKLQkJfQotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCXJldHVybjsKLQotCQlJUGF0aCBwYXRoID0gZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZCgicHVibGlzaC50eHQiKTsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgudG9GaWxlKCkpOwotCQkJcC5sb2FkKGZpbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQkKLQkJUHVibGlzaEhlbHBlciBoZWxwZXIgPSBuZXcgUHVibGlzaEhlbHBlcihnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLmFwcGVuZCgidGVtcCIpLnRvRmlsZSgpKTsKLQkJaWYgKG1vZHVsZVRyZWUubGVuZ3RoID09IDEpIC8vIHdlYiBtb2R1bGUKLQkJCXB1Ymxpc2hEaXIoZGVsdGFLaW5kLCBwLCBtb2R1bGVUcmVlLCBoZWxwZXIsIG1vbml0b3IpOwotCQllbHNlIC8vIHV0aWxpdHkgamFyCi0JCQlwdWJsaXNoSmFyKGtpbmQsIGRlbHRhS2luZCwgcCwgbW9kdWxlVHJlZSwgaGVscGVyLCBtb25pdG9yKTsKLQkJCi0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGVUcmVlLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JCQotCQl0cnkgewotCQkJcC5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKSwgIlRvbWNhdCBwdWJsaXNoIGRhdGEiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaCBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGRlbHRhS2luZAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEaXIoaW50IGRlbHRhS2luZCwgUHJvcGVydGllcyBwLCBJTW9kdWxlIG1vZHVsZVtdLCBQdWJsaXNoSGVscGVyIGhlbHBlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBSZW1vdmUgaWYgcmVxdWVzdGVkIG9yIGlmIHByZXZpb3VzbHkgcHVibGlzaGVkIGFuZCBhcmUgbm93IHNlcnZpbmcgd2l0aG91dCBwdWJsaXNoaW5nCi0JCWlmIChkZWx0YUtpbmQgPT0gUkVNT1ZFRCB8fCBnZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCVN0cmluZyBwdWJsaXNoUGF0aCA9IChTdHJpbmcpIHAuZ2V0KG1vZHVsZVswXS5nZXRJZCgpKTsKLQkJCWlmIChwdWJsaXNoUGF0aCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUocHVibGlzaFBhdGgpOwotCQkJCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCQkJSVN0YXR1c1tdIHN0YXQgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShmLCBtb25pdG9yKTsKLQkJCQkJCVB1Ymxpc2hPcGVyYXRpb24yLmFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb3VsZE5vdFJlbW92ZU1vZHVsZSxtb2R1bGVbMF0uZ2V0TmFtZSgpKSwgZSkpOwotCQkJCX0KLQkJCQlwLnJlbW92ZShtb2R1bGVbMF0uZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJUGF0aCBwYXRoID0gZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZVswXSk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldFJlc291cmNlcyhtb2R1bGUpOwotCQkJSVBhdGggW10gamFyUGF0aHMgPSBudWxsOwotCQkJSU1vZHVsZSBbXSBjaGlsZE1vZHVsZXMgPSBnZXRTZXJ2ZXIoKS5nZXRDaGlsZE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCWlmIChjaGlsZE1vZHVsZXMgIT0gbnVsbCAmJiBjaGlsZE1vZHVsZXMubGVuZ3RoID4gMCkgewotCQkJCWphclBhdGhzID0gbmV3IElQYXRoW2NoaWxkTW9kdWxlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWphclBhdGhzW2ldID0gbmV3IFBhdGgoIldFQi1JTkYvbGliIikuYXBwZW5kKGNoaWxkTW9kdWxlc1tpXS5nZXROYW1lKCkgKyAiLmphciIpOwotCQkJCX0KLQkJCX0KLQkJCUlTdGF0dXNbXSBzdGF0ID0gaGVscGVyLnB1Ymxpc2hTbWFydChtciwgcGF0aCwgamFyUGF0aHMsIG1vbml0b3IpOwotCQkJUHVibGlzaE9wZXJhdGlvbjIuYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCXAucHV0KG1vZHVsZVswXS5nZXRJZCgpLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJUHVibGlzaE9wZXJhdGlvbjIudGhyb3dFeGNlcHRpb24oc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGEgamFyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGRlbHRhS2luZAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hKYXIoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIFByb3BlcnRpZXMgcCwgSU1vZHVsZVtdIG1vZHVsZSwgUHVibGlzaEhlbHBlciBoZWxwZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBSZW1vdmUgaWYgcmVxdWVzdGVkIG9yIGlmIHByZXZpb3VzbHkgcHVibGlzaGVkIGFuZCBhcmUgbm93IHNlcnZpbmcgd2l0aG91dCBwdWJsaXNoaW5nCi0JCWlmIChkZWx0YUtpbmQgPT0gUkVNT1ZFRCB8fCBnZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHB1Ymxpc2hQYXRoID0gKFN0cmluZykgcC5nZXQobW9kdWxlWzFdLmdldElkKCkpOwotCQkJCWlmIChwdWJsaXNoUGF0aCAhPSBudWxsKSB7Ci0JCQkJCW5ldyBGaWxlKHB1Ymxpc2hQYXRoKS5kZWxldGUoKTsKLQkJCQkJcC5yZW1vdmUobW9kdWxlWzFdLmdldElkKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgcmVtb3ZlIG1vZHVsZSIsIGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHBhdGggPSBnZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkobW9kdWxlWzBdKTsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZCgiV0VCLUlORiIpLmFwcGVuZCgibGliIik7Ci0JCQlJUGF0aCBqYXJQYXRoID0gcGF0aC5hcHBlbmQobW9kdWxlWzFdLmdldE5hbWUoKSArICIuamFyIik7Ci0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiBmaWxlIHN0aWxsIGV4aXN0cyBhbmQgd2UgYXJlIG5vdCBmb3JjaW5nIGEgbmV3IG9uZSB0byBiZSBidWlsdAotCQkJCWlmIChqYXJQYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCQkJLy8gYXZvaWQgY2hhbmdlcyBpZiBubyBjaGFuZ2VzIHRvIG1vZHVsZSBzaW5jZSBsYXN0IHB1Ymxpc2gKLQkJCQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldFJlc291cmNlcyhtb2R1bGUpOwotCQkJSVN0YXR1c1tdIHN0YXQgPSBoZWxwZXIucHVibGlzaFppcChtciwgamFyUGF0aCwgbW9uaXRvcik7Ci0JCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVB1Ymxpc2hPcGVyYXRpb24yLmFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCQlQdWJsaXNoT3BlcmF0aW9uMi50aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQkJcC5wdXQobW9kdWxlWzFdLmdldElkKCksIGphclBhdGgudG9PU1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hGaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzOwotCQlJUGF0aCBiYXNlRGlyID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJVG9tY2F0U2VydmVyIHRzID0gZ2V0VG9tY2F0U2VydmVyKCk7Ci0JCUlUb21jYXRWZXJzaW9uSGFuZGxlciB0dmggPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpOwotCQkvLyBJbmNsdWRlIG9yIHJlbW92ZSBsb2FkZXIgamFyIGRlcGVuZGluZyBvbiBzdGF0ZSBvZiBzZXJ2aW5nIGRpcmVjdGx5IAotCQlzdGF0dXMgPSB0dmgucHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShiYXNlRGlyLCBnZXRUb21jYXRTZXJ2ZXIoKSk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBJZiBzZXJ2aW5nIG1vZHVsZXMgZGlyZWN0bHksIHVwZGF0ZSBzZXJ2ZXIueG1sIGFjY29yZGluZ2x5IChpbmNsdWRlcyBwcm9qZWN0IGNvbnRleHQueG1scykKLQkJCWlmICh0cy5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCQlzdGF0dXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkudXBkYXRlQ29udGV4dHNUb1NlcnZlRGlyZWN0bHkoCi0JCQkJCQliYXNlRGlyLCB0dmguZ2V0U2hhcmVkTG9hZGVyKGJhc2VEaXIpLCBtb25pdG9yKTsKLQkJCX0KLQkJCS8vIEVsc2Ugc2VydmluZyBub3JtYWxseS4gQWRkIHByb2plY3QgY29udGV4dC54bWxzIHRvIHNlcnZlci54bWwKLQkJCWVsc2UgewotCQkJCS8vIFB1Ymxpc2ggY29udGV4dCBjb25maWd1cmF0aW9uIGZvciBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBNRVRBLUlORi9jb250ZXh0LnhtbAotCQkJCXN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5wdWJsaXNoQ29udGV4dENvbmZpZygKLQkJCQkJCWJhc2VEaXIsIGdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpLCBtb25pdG9yKTsKLQkJCX0KLQkJCWlmIChzdGF0dXMuaXNPSygpICYmIHRzLmlzU2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKCkpIHsKLQkJCQkvLyBEZXRlcm1pbmUgaWYgY29udGV4dCdzIHBhdGggYXR0cmlidXRlIHNob3VsZCBiZSByZW1vdmVkCi0JCQkJU3RyaW5nIGlkID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQkJYm9vbGVhbiBub1BhdGggPSBpZC5pbmRleE9mKCI1NSIpID4gMCB8fCBpZC5pbmRleE9mKCI2MCIpID4gMDsKLQkJCQlib29sZWFuIHNlcnZlclN0b3BwZWQgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRDsKLQkJCQkvLyBUT0RPIEFkZCBhIG1vbml0b3IKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLm1vdmVDb250ZXh0c1RvU2VwYXJhdGVGaWxlcyhiYXNlRGlyLCBub1BhdGgsIHNlcnZlclN0b3BwZWQsIG51bGwpOwotCQkJfQotCQl9Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogU2V0dXAgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaCBJTGF1bmNoCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCJ0cnVlIi5lcXVhbHMobGF1bmNoLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAiZmFsc2UiKSkpCi0JCQlyZXR1cm47Ci0JCS8vaWYgKGdldFRvbWNhdFJ1bnRpbWUoKSA9PSBudWxsKQotCQkvLwl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRSdW50aW1lKCkudmFsaWRhdGUoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJLy9zZXRSZXN0YXJ0TmVlZGVkKGZhbHNlKTsKLQkJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBwb3J0cyBhcmUgZnJlZQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQlMaXN0IHVzZWRQb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3AuZ2V0UG9ydCgpIDwgMCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUG9ydEludmFsaWQsIG51bGwpKTsKLQkJCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHNwLmdldFBvcnQoKSwgNSkpIHsKLQkJCQl1c2VkUG9ydHMuYWRkKHNwKTsKLQkJCX0KLQkJfQotCQlpZiAodXNlZFBvcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgdXNlZFBvcnRzLmdldCgwKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydC5nZXRQb3J0KCkgKyAiIiwgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpfSksIG51bGwpKTsKLQkJfSBlbHNlIGlmICh1c2VkUG9ydHMuc2l6ZSgpID4gMSkgewotCQkJU3RyaW5nIHBvcnRTdHIgPSAiIjsKLQkJCWl0ZXJhdG9yID0gdXNlZFBvcnRzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWZpcnN0KQotCQkJCQlwb3J0U3RyICs9ICIsICI7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlTZXJ2ZXJQb3J0IHNwID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlwb3J0U3RyICs9ICIiICsgc3AuZ2V0UG9ydCgpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclBvcnRzSW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydFN0ciwgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpfSksIG51bGwpKTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBhcHAgZm9yIGVhY2ggY29udGV4dCByb290Ci0JCWl0ZXJhdG9yID0gY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBjb250ZXh0Um9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0UGF0aCgpOwotCQkJaWYgKGNvbnRleHRSb290cy5jb250YWlucyhjb250ZXh0Um9vdCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZUNvbnRleHRSb290LCBuZXcgU3RyaW5nW10geyBjb250ZXh0Um9vdCB9KSwgbnVsbCkpOwotCQkJCi0JCQljb250ZXh0Um9vdHMuYWRkKGNvbnRleHRSb290KTsKLQkJfQotCQkKLQkJc2V0U2VydmVyUmVzdGFydFN0YXRlKGZhbHNlKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVElORyk7Ci0JCXNldE1vZGUobGF1bmNoTW9kZSk7Ci0JCQotCQkvLyBwaW5nIHNlcnZlciB0byBjaGVjayBmb3Igc3RhcnR1cAotCQl0cnkgewotCQkJU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0IjsKLQkJCWludCBwb3J0ID0gY29uZmlndXJhdGlvbi5nZXRNYWluUG9ydCgpLmdldFBvcnQoKTsKLQkJCWlmIChwb3J0ICE9IDgwKQotCQkJCXVybCArPSAiOiIgKyBwb3J0OwotCQkJcGluZyA9IG5ldyBQaW5nVGhyZWFkKGdldFNlcnZlcigpLCB1cmwsIC0xLCB0aGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNhbid0IHBpbmcgZm9yIFRvbWNhdCBzdGFydHVwLiIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYW5seSBzaHV0cyBkb3duIGFuZCB0ZXJtaW5hdGVzIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoZm9yY2UpIHsKLQkJCXRlcm1pbmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzdGF0ZSA9IGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCk7Ci0JCS8vIElmIHN0b3BwZWQgb3Igc3RvcHBpbmcsIG5vIG5lZWQgdG8gcnVuIHN0b3AgY29tbWFuZCBhZ2FpbgotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8ICBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQl0ZXJtaW5hdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU3RvcHBpbmcgVG9tY2F0Iik7Ci0JCQlpZiAoc3RhdGUgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOwotCQotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gKChTZXJ2ZXIpZ2V0U2VydmVyKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQkKLQkJCVN0cmluZyBhcmdzID0gcmVuZGVyQ29tbWFuZExpbmUoZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoZmFsc2UpLCAiICIpOwotCQkJLy8gUmVtb3ZlIEpNWCBhcmd1bWVudHMgaWYgcHJlc2VudAotCQkJU3RyaW5nIGV4aXN0aW5nVk1BcmdzID0gd2MuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLQkJCWlmIChleGlzdGluZ1ZNQXJncy5pbmRleE9mKEpNWF9FWENMVURFX0FSR1NbMF0pID49IDApIHsKLQkJCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLCAKLQkJCQkJCW1lcmdlQXJndW1lbnRzKGV4aXN0aW5nVk1BcmdzLCBuZXcgU3RyaW5nIFtdIHt9LCBKTVhfRVhDTFVERV9BUkdTLCBmYWxzZSkpOwotCQkJfQotCQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCBhcmdzKTsKLQkJCXdjLnNldEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuZGVidWcudWkucHJpdmF0ZSIsIHRydWUpOwotCQkJd2Muc2V0QXR0cmlidXRlKEFUVFJfU1RPUCwgInRydWUiKTsKLQkJCXdjLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBUb21jYXQiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiS2lsbGluZyB0aGUgVG9tY2F0IHByb2Nlc3MiKTsKLQkJCUlMYXVuY2ggbGF1bmNoID0gZ2V0U2VydmVyKCkuZ2V0TGF1bmNoKCk7Ci0JCQlpZiAobGF1bmNoICE9IG51bGwpIHsKLQkJCQlsYXVuY2gudGVybWluYXRlKCk7Ci0JCQkJc3RvcEltcGwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGtpbGxpbmcgdGhlIHByb2Nlc3MiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRvbWNhdFNlcnZlciI7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldE5leHRUb2tlbihTdHJpbmcgcywgaW50IHN0YXJ0KSB7Ci0JCWludCBpID0gc3RhcnQ7Ci0JCWludCBsZW5ndGggPSBzLmxlbmd0aCgpOwotCQljaGFyIGxvb2tGb3IgPSAnICc7Ci0JCQotCQl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAobG9va0ZvciA9PSBjKSB7Ci0JCQkJaWYgKGxvb2tGb3IgPT0gJyInKQotCQkJCQlyZXR1cm4gaSsxOwotCQkJCXJldHVybiBpOwotCQkJfQotCQkJaWYgKGMgPT0gJyInKQotCQkJCWxvb2tGb3IgPSAnIic7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBNZXJnZSB0aGUgZ2l2ZW4gYXJndW1lbnRzIGludG8gdGhlIG9yaWdpbmFsIGFyZ3VtZW50IHN0cmluZywgcmVwbGFjaW5nCi0JICogaW52YWxpZCB2YWx1ZXMgaWYgdGhleSBoYXZlIGJlZW4gY2hhbmdlZC4gIFNwZWNpYWwgaGFuZGxpbmcgaXMgcHJvdmlkZWQKLQkgKiBpZiB0aGUga2VlcEFjdGlvbkxhc3QgYXJndW1lbnQgaXMgdHJ1ZSBhbmQgdGhlIGxhc3Qgdm1BcmcgaXMgYSBzaW1wbGUKLQkgKiBzdHJpbmcuICBUaGUgdm1BcmdzIHdpbGwgYmUgbWVyZ2VkIHN1Y2ggdGhhdCB0aGUgbGFzdCB2bUFyZyBpcyBndWFyYW50ZWVkCi0JICogdG8gYmUgdGhlIGxhc3QgYXJndW1lbnQgaW4gdGhlIG1lcmdlZCBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmFsQXJnIFN0cmluZyBvZiBvcmlnaW5hbCBhcmd1bWVudHMuCi0JICogQHBhcmFtIHZtQXJncyBBcmd1bWVudHMgdG8gbWVyZ2UgaW50byB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlQXJncyBBcmd1bWVudHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMgc3RyaW5nCi0JICogQHBhcmFtIGtlZXBBY3Rpb25MYXN0IElmIDxiPnRydWU8L2I+IHRoZSB2bUFyZ3VtZW50cyBhcmUgYXNzdW1lZCB0byBiZSBUb21jYXQKLQkgKiBwcm9ncmFtIGFyZ3VtZW50cywgdGhlIGxhc3Qgb2Ygd2hpY2ggaXMgdGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoaWNoIG11c3QKLQkgKiByZW1haW4gdGhlIGxhc3QgYXJndW1lbnQuICBUaGlzIG9ubHkgaGFzIGFuIGltcGFjdCBpZiB0aGUgbGFzdCB2bUFyZyBpcwotCSAqIGEgc2ltcGxlIHN0cmluZyBhcmd1bWVudCwgbGlrZSAmcXVvdDtzdGFydCZxdW90Oy4KLQkgKiBAcmV0dXJuIG1lcmdlZCBhcmd1bWVudCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXJnZUFyZ3VtZW50cyhTdHJpbmcgb3JpZ2luYWxBcmcsIFN0cmluZ1tdIHZtQXJncywgU3RyaW5nW10gZXhjbHVkZUFyZ3MsIGJvb2xlYW4ga2VlcEFjdGlvbkxhc3QpIHsKLQkJaWYgKHZtQXJncyA9PSBudWxsKQotCQkJcmV0dXJuIG9yaWdpbmFsQXJnOwotCQkKLQkJaWYgKG9yaWdpbmFsQXJnID09IG51bGwpCi0JCQlvcmlnaW5hbEFyZyA9ICIiOwotCQkKLQkJLy8gcmVwbGFjZSBhbmQgbnVsbCBvdXQgYWxsIHZtYXJncyB0aGF0IGFscmVhZHkgZXhpc3QKLQkJaW50IHNpemUgPSB2bUFyZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaW50IGluZCA9IHZtQXJnc1tpXS5pbmRleE9mKCIgIik7Ci0JCQlpbnQgaW5kMiA9IHZtQXJnc1tpXS5pbmRleE9mKCI9Iik7Ci0JCQlpZiAoaW5kID49IDAgJiYgKGluZDIgPT0gLTEgfHwgaW5kIDwgaW5kMikpIHsgLy8gLWEgYmMgc3R5bGUKLQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKHZtQXJnc1tpXS5zdWJzdHJpbmcoMCwgaW5kICsgMSkpOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkvLyByZXBsYWNlCi0JCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXggKyBpbmQgKyAxKTsKLQkJCQkJaWYgKGluZGV4MiA+PSAwKQotCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKLQkJCQkJdm1BcmdzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGluZDIgPj0gMCkgeyAvLyBhPWIgc3R5bGUKLQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKHZtQXJnc1tpXS5zdWJzdHJpbmcoMCwgaW5kMiArIDEpKTsKLQkJCQlpZiAoaW5kZXggPT0gMCB8fCAoaW5kZXggPiAwICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleCAtIDEpID09ICcgJykpIHsKLQkJCQkJLy8gcmVwbGFjZQotCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKLQkJCQkJaWYgKGluZGV4MiA+PSAwKQotCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKLQkJCQkJdm1BcmdzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBhYmMgc3R5bGUKLQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKHZtQXJnc1tpXSk7Ci0JCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXgtMSkgPT0gJyAnKSkgewotCQkJCQkvLyByZXBsYWNlCi0JCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOwotCQkJCQlpZiAoIWtlZXBBY3Rpb25MYXN0IHx8IGkgPCAoc2l6ZSAtIDEpKSB7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApCi0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCQllbHNlCi0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldOwotCQkJCQkJdm1BcmdzW2ldID0gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFRoZSBsYXN0IFZNIGFyZ3VtZW50IG5lZWRzIHRvIHJlbWFpbiBsYXN0LAotCQkJCQkJLy8gcmVtb3ZlIG9yaWdpbmFsIGFyZyBhbmQgYXBwZW5kIHRoZSB2bUFyZyBsYXRlcgotCQkJCQkJaWYgKGluZGV4MiA+PSAwKQotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQkJZWxzZQotCQkJCQkJCW9yaWdpbmFsQXJnID0gczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBleGNsdWRlZCBhcmd1bWVudHMKLQkJaWYgKGV4Y2x1ZGVBcmdzICE9IG51bGwgJiYgZXhjbHVkZUFyZ3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWludCBpbmQgPSBleGNsdWRlQXJnc1tpXS5pbmRleE9mKCIgIik7Ci0JCQkJaW50IGluZDIgPSBleGNsdWRlQXJnc1tpXS5pbmRleE9mKCI9Iik7Ci0JCQkJaWYgKGluZCA+PSAwICYmIChpbmQyID09IC0xIHx8IGluZCA8IGluZDIpKSB7IC8vIC1hIGJjIHN0eWxlCi0JCQkJCWludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2YoZXhjbHVkZUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZCArIDEpKTsKLQkJCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpKSB7Ci0JCQkJCQkvLyByZW1vdmUKLQkJCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4ICsgaW5kICsgMSk7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCQkvLyBJZiByZW1haW5kZXIgd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGFyZ3VtZW50LCByZW1vdmUgbGVhZGluZyBibGFua3MKLQkJCQkJCQl3aGlsZSAoaW5kZXgyIDwgb3JpZ2luYWxBcmcubGVuZ3RoKCkgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4MikgPT0gJyAnKQotCQkJCQkJCQlpbmRleDIgKz0gMTsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGluZDIgPj0gMCkgeyAvLyBhPWIgc3R5bGUKLQkJCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZihleGNsdWRlQXJnc1tpXS5zdWJzdHJpbmcoMCwgaW5kMiArIDEpKTsKLQkJCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpKSB7Ci0JCQkJCQkvLyByZW1vdmUKLQkJCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKLQkJCQkJCWlmIChpbmRleDIgPj0gMCkgewotCQkJCQkJCS8vIElmIHJlbWFpbmRlciB3aWxsIGJlY29tZSB0aGUgZmlyc3QgYXJndW1lbnQsIHJlbW92ZSBsZWFkaW5nIGJsYW5rcwotCQkJCQkJCXdoaWxlIChpbmRleDIgPCBvcmlnaW5hbEFyZy5sZW5ndGgoKSAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXgyKSA9PSAnICcpCi0JCQkJCQkJCWluZGV4MiArPSAxOwotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCW9yaWdpbmFsQXJnID0gczsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGFiYyBzdHlsZQotCQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKGV4Y2x1ZGVBcmdzW2ldKTsKLQkJCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXgtMSkgPT0gJyAnKSkgewotCQkJCQkJLy8gcmVtb3ZlCi0JCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCQkvLyBSZW1vdmUgbGVhZGluZyBibGFua3MKLQkJCQkJCQl3aGlsZSAoaW5kZXgyIDwgb3JpZ2luYWxBcmcubGVuZ3RoKCkgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4MikgPT0gJyAnKQotCQkJCQkJCQlpbmRleDIgKz0gMTsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcmVtYWluaW5nIHZtYXJncyB0byB0aGUgZW5kCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAodm1BcmdzW2ldICE9IG51bGwpIHsKLQkJCQlpZiAob3JpZ2luYWxBcmcubGVuZ3RoKCkgPiAwICYmICFvcmlnaW5hbEFyZy5lbmRzV2l0aCgiICIpKQotCQkJCQlvcmlnaW5hbEFyZyArPSAiICI7Ci0JCQkJb3JpZ2luYWxBcmcgKz0gdm1BcmdzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gb3JpZ2luYWxBcmc7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgY3VycmVudCBKUkUgY29udGFpbmVyIGNsYXNzcGF0aCB3aXRoIHRoZSBnaXZlbiBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY3AKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZUpSRUNvbnRhaW5lcihMaXN0IGNwLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWludCBzaXplID0gY3Auc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeTIgPSAoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgY3AuZ2V0KGkpOwotCQkJaWYgKGVudHJ5Mi5nZXRQYXRoKCkudXB0b1NlZ21lbnQoMikuaXNQcmVmaXhPZihlbnRyeS5nZXRQYXRoKCkpKSB7Ci0JCQkJY3Auc2V0KGksIGVudHJ5KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWNwLmFkZCgwLCBlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogTWVyZ2UgYSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IGludG8gdGhlIGNsYXNzcGF0aCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBjcAotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZUNsYXNzcGF0aChMaXN0IGNwLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY3AuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeTIgPSAoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAoZW50cnkyLmdldFBhdGgoKS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWNwLmFkZChlbnRyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZXhpc3RpbmdQcm9nQXJncyA9IHdvcmtpbmdDb3B5LmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAotCQkJCW1lcmdlQXJndW1lbnRzKGV4aXN0aW5nUHJvZ0FyZ3MsIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKHRydWUpLCBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKHRydWUpLCB0cnVlKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RpbmdWTUFyZ3MgPSB3b3JraW5nQ29weS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotCQlTdHJpbmdbXSBwYXJzZWRWTUFyZ3MgPSBudWxsOwotCQlpZiAobnVsbCAhPSBleGlzdGluZ1ZNQXJncykgewotCQkJcGFyc2VkVk1BcmdzID0gRGVidWdQbHVnaW4ucGFyc2VBcmd1bWVudHMoZXhpc3RpbmdWTUFyZ3MpOwotCQl9Ci0JCVN0cmluZyBbXSBjb25maWdWTUFyZ3MgPSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoKTsKLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzU2VjdXJlKCkpIHsKLQkJCWJvb2xlYW4gYWRkU2VjdXJpdHlBcmdzID0gdHJ1ZTsKLQkJCWlmIChudWxsICE9IHBhcnNlZFZNQXJncykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkVk1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChwYXJzZWRWTUFyZ3NbaV0uc3RhcnRzV2l0aCgid3RwLmNvbmZpZ3VyZWQuc2VjdXJpdHkiKSkgewotCQkJCQkJYWRkU2VjdXJpdHlBcmdzID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRTZWN1cml0eUFyZ3MpIHsKLQkJCQlTdHJpbmcgW10gbmV3Vk1BcmdzID0gbmV3IFN0cmluZyBbY29uZmlnVk1BcmdzLmxlbmd0aCArIDNdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29uZmlnVk1BcmdzLCAwLCBuZXdWTUFyZ3MsIDAsIGNvbmZpZ1ZNQXJncy5sZW5ndGgpOwotCQkJCW5ld1ZNQXJnc1tjb25maWdWTUFyZ3MubGVuZ3RoXSA9ICItRGphdmEuc2VjdXJpdHkubWFuYWdlciI7Ci0JCQkJbmV3Vk1BcmdzW2NvbmZpZ1ZNQXJncy5sZW5ndGggKyAxXSA9ICItRGphdmEuc2VjdXJpdHkucG9saWN5PVwiIgotCQkJCQkJKyBnZXRSdW50aW1lUG9saWN5RmlsZSgpICsiXCIiOwotCQkJCW5ld1ZNQXJnc1tjb25maWdWTUFyZ3MubGVuZ3RoICsgMl0gPSAiLUR3dHAuY29uZmlndXJlZC5zZWN1cml0eT10cnVlIjsKLQkJCQljb25maWdWTUFyZ3MgPSBuZXdWTUFyZ3M7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobnVsbCAhPSBwYXJzZWRWTUFyZ3MpewotCQkJYm9vbGVhbiByZW1vdmVTZWN1cml0eUFyZ3MgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkVk1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHBhcnNlZFZNQXJnc1tpXS5zdGFydHNXaXRoKCItRHd0cC5jb25maWd1cmVkLnNlY3VyaXR5IikpIHsKLQkJCQkJcmVtb3ZlU2VjdXJpdHlBcmdzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZVNlY3VyaXR5QXJncykgewotCQkJCVN0cmluZ0J1ZmZlciBmaWx0ZXJlZFZNQXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZFZNQXJncy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgYXJnID0gcGFyc2VkVk1BcmdzW2ldOwotCQkJCQlpZiAoIWFyZy5zdGFydHNXaXRoKCItRGphdmEuc2VjdXJpdHkubWFuYWdlciIpCi0JCQkJCQkJJiYgIWFyZy5zdGFydHNXaXRoKCItRGphdmEuc2VjdXJpdHkucG9saWN5PSIpCi0JCQkJCQkJJiYgIWFyZy5zdGFydHNXaXRoKCItRHd0cC5jb25maWd1cmVkLnNlY3VyaXR5PSIpKSB7Ci0JCQkJCQlpZiAoZmlsdGVyZWRWTUFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJZmlsdGVyZWRWTUFyZ3MuYXBwZW5kKCcgJyk7Ci0JCQkJCQl9Ci0JCQkJCQlmaWx0ZXJlZFZNQXJncy5hcHBlbmQoYXJnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlleGlzdGluZ1ZNQXJncyA9IGZpbHRlcmVkVk1BcmdzLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywKLQkJCQltZXJnZUFyZ3VtZW50cyhleGlzdGluZ1ZNQXJncywgY29uZmlnVk1BcmdzLCBudWxsLCBmYWxzZSkpOwotCQkKLQkJSVRvbWNhdFJ1bnRpbWUgcnVudGltZSA9IGdldFRvbWNhdFJ1bnRpbWUoKTsKLQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBydW50aW1lLmdldFZNSW5zdGFsbCgpOwotCQlpZiAodm1JbnN0YWxsICE9IG51bGwpCi0JCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSlJFX0NPTlRBSU5FUl9QQVRILCBKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKHZtSW5zdGFsbCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCi0JCS8vIHVwZGF0ZSBjbGFzc3BhdGgKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ2xhc3NwYXRoID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHdvcmtpbmdDb3B5KTsKLQkJaW50IHNpemUgPSBvcmlnaW5hbENsYXNzcGF0aC5sZW5ndGg7Ci0JCUxpc3Qgb2xkQ3AgPSBuZXcgQXJyYXlMaXN0KG9yaWdpbmFsQ2xhc3NwYXRoLmxlbmd0aCArIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW9sZENwLmFkZChvcmlnaW5hbENsYXNzcGF0aFtpXSk7Ci0JCQotCQlMaXN0IGNwMiA9IHJ1bnRpbWUuZ2V0UnVudGltZUNsYXNzcGF0aCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNwMi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1lcmdlQ2xhc3NwYXRoKG9sZENwLCBlbnRyeSk7Ci0JCX0KLQkJCi0JCWlmICh2bUluc3RhbGwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHlwZUlkID0gdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpOwotCQkJCXJlcGxhY2VKUkVDb250YWluZXIob2xkQ3AsIEphdmFSdW50aW1lLm5ld1J1bnRpbWVDb250YWluZXJDbGFzc3BhdGhFbnRyeShuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKS5hcHBlbmQodHlwZUlkKS5hcHBlbmQodm1JbnN0YWxsLmdldE5hbWUoKSksIElSdW50aW1lQ2xhc3NwYXRoRW50cnkuQk9PVFNUUkFQX0NMQVNTRVMpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCUlQYXRoIGpyZVBhdGggPSBuZXcgUGF0aCh2bUluc3RhbGwuZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKGpyZVBhdGggIT0gbnVsbCkgewotCQkJCUlQYXRoIHRvb2xzUGF0aCA9IGpyZVBhdGguYXBwZW5kKCJsaWIiKS5hcHBlbmQoInRvb2xzLmphciIpOwotCQkJCWlmICh0b29sc1BhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB0b29sc0phciA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkodG9vbHNQYXRoKTsKLQkJCQkJLy8gU2VhcmNoIGZvciBpbmRleCB0byBhbnkgZXhpc3RpbmcgdG9vbHMuamFyIGVudHJ5Ci0JCQkJCWludCB0b29sc0luZGV4OwotCQkJCQlmb3IgKHRvb2xzSW5kZXggPSAwOyB0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpOyB0b29sc0luZGV4KysgKSB7Ci0JCQkJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIG9sZENwLmdldCh0b29sc0luZGV4KTsKLQkJCQkJCWlmIChlbnRyeS5nZXRUeXBlKCkgPT0gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5BUkNISVZFCi0JCQkJCQkJCSYmIGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLmVxdWFscygidG9vbHMuamFyIikpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBJZiBleGlzdGluZyB0b29scy5qYXIgZm91bmQsIHJlcGxhY2UgaW4gY2FzZSBpdCdzIGRpZmZlcmVudC4gIE90aGVyd2lzZSBhZGQuCi0JCQkJCWlmICh0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpKQotCQkJCQkJb2xkQ3Auc2V0KHRvb2xzSW5kZXgsIHRvb2xzSmFyKTsgCi0JCQkJCWVsc2UKLQkJCQkJCW1lcmdlQ2xhc3NwYXRoKG9sZENwLCB0b29sc0phcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpdGVyYXRvciA9IG9sZENwLml0ZXJhdG9yKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldE1lbWVudG8oKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZXNvbHZlIGNsYXNzcGF0aCBlbnRyeTogIiArIGVudHJ5LCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTUEFUSCwgbGlzdCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNoYW5kbGVSZXNvdXJjZUNoYW5nZSgpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QWxsTW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChjb250YWluc05vblJlc291cmNlQ2hhbmdlKGRlbHRhKSkgewotCQkJCXNldFNlcnZlclJlc3RhcnRTdGF0ZSh0cnVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc05vblJlc291cmNlQ2hhbmdlKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEpIHsKLQkJaW50IHNpemUgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YSBkID0gZGVsdGFbaV07Ci0JCQlpZiAoZC5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JCQkJaWYgKCJXRUItSU5GIi5lcXVhbHMoZC5nZXRNb2R1bGVSZXNvdXJjZSgpLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIGNvbnRhaW5zTm9uUmVzb3VyY2VDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChkLmdldE1vZHVsZVJlc291cmNlKCkgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJYm9vbGVhbiBiID0gY29udGFpbnNOb25BZGRDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zTm9uQWRkQ2hhbmdlKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEpIHsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgZCA9IGRlbHRhW2ldOwotCQkJaWYgKGQuZ2V0TW9kdWxlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJaWYgKGQuZ2V0S2luZCgpICE9IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBiID0gY29udGFpbnNOb25BZGRDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhbnMgdGhlIGVudGlyZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhpcyBzZXJ2ZXIuICBUaGlzIGludm9sdmVzCi0JICogZGVsZXRpbmcgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBzZXJ2ZXIncyB3b3JrIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdHMgb2YgdGhlIGNsZWFuIG9wZXJhdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNsZWFuU2VydmVyV29ya0RpcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyByZXN1bHQ7Ci0JCUlQYXRoIGJhc2VQYXRoID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJSVBhdGggd29ya1BhdGggPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkuZ2V0U2VydmVyV29ya0RpcmVjdG9yeShiYXNlUGF0aCk7Ci0JCWlmICh3b3JrUGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlIHdvcmtEaXIgPSB3b3JrUGF0aC50b0ZpbGUoKTsKLQkJCXJlc3VsdCA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQlpZiAod29ya0Rpci5leGlzdHMoKSAmJiB3b3JrRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkvLyBEZWxldGUgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHNlcnZlcidzIHdvcmsgZGlyCi0JCQkJRmlsZVtdIGZpbGVzID0gd29ya0Rpci5saXN0RmlsZXMoKTsKLQkJCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJQcm9ibGVtIG9jY3VycmVkIGRlbGV0aW5nIHdvcmsgZGlyZWN0b3J5IGZvciBtb2R1bGUuIiwgbnVsbCk7Ci0JCQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKCJDbGVhbmluZyBTZXJ2ZXIgV29yayBEaXJlY3RvcnkiLCBuZXcgU3RyaW5nW10geyB3b3JrRGlyLmdldEFic29sdXRlUGF0aCgpIH0pLCBzaXplICogMTApOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQkJCWlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCQlJU3RhdHVzIFtdIHJlc3VsdHMgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShjdXJyZW50LCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMCkpOwotCQkJCQkJCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0cy5sZW5ndGg7IGorKykgewotCQkJCQkJCQkJbXMuYWRkKHJlc3VsdHNbal0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlyZXN1bHQgPSBtczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHdvcmsgZGlyZWN0b3J5IGZvciBtb2R1bGUiLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBDbGVhbnMgdGhlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvbiB0aGlzCi0JICogc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgbW9kdWxlIHdob3NlIHdvcmsgZGlyZWN0b3J5IHNob3VsZCBiZSBjbGVhbmVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNsZWFuIG9wZXJhdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNsZWFuQ29udGV4dFdvcmtEaXIoSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHJlc3VsdDsKLQkJSVBhdGggYmFzZVBhdGggPSBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlJUGF0aCB3b3JrUGF0aCA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlUGF0aCwgbW9kdWxlKTsKLQkJaWYgKHdvcmtQYXRoICE9IG51bGwpIHsKLQkJCUZpbGUgd29ya0RpciA9IHdvcmtQYXRoLnRvRmlsZSgpOwotCQkJcmVzdWx0ID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCWlmICh3b3JrRGlyLmV4aXN0cygpICYmIHdvcmtEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCUlTdGF0dXMgW10gcmVzdWx0cyA9IFB1Ymxpc2hIZWxwZXIuZGVsZXRlRGlyZWN0b3J5KHdvcmtEaXIsIG1vbml0b3IpOwotCQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJQcm9ibGVtIG9jY3VycmVkIGRlbGV0aW5nIHdvcmsgZGlyZWN0b3J5IGZvciBtb2R1bGUuIiwgbnVsbCk7Ci0JCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQltcy5hZGQocmVzdWx0c1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0ID0gbXM7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHdvcmsgZGlyZWN0b3J5IGZvciBtb2R1bGUiLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUgZGVwbG95ZWQgZm9yCi0JICogdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBmdWxsIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0VG9tY2F0U2VydmVyKCkuZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCB0byBkZXBsb3kgYSBtb2R1bGUncyB3ZWIgYXBwbGljYXRpb24uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gZnVsbCBwYXRoIHRvIGRlcGxveW1lbnQgZGlyZWN0b3J5IGZvciB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZURlcGxveURpcmVjdG9yeShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkuYXBwZW5kKG1vZHVsZS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wb3JhcnkgbWV0aG9kIHRvIGhlbHAgd2ViIHNlcnZpY2VzIHRlYW0uIFJldHVybnMgdGhlIHBhdGggdGhhdCB0aGUgbW9kdWxlIGlzCi0JICogcHVibGlzaGVkIHRvLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUgb24gdGhlIHNlcnZlciAKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIHRoYXQgdGhlIG1vZHVsZSBpcyBwdWJsaXNoZWQgdG8gd2hlbiBpbiB0ZXN0IGVudmlyb25tZW50IG1vZGUsCi0JICogICAgb3IgbnVsbCBpZiB0aGUgbW9kdWxlIGlzIG5vdCBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UHVibGlzaERpcmVjdG9yeShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBnZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkobW9kdWxlWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVQdWJsaXNoU3RhdGUyKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4NzYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXJMb2NhdG9yIGV4dGVuZHMgU2VydmVyTG9jYXRvckRlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JTZXJ2ZXJzKFN0cmluZyBob3N0LCBmaW5hbCBJU2VydmVyU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUb21jYXRSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBUb21jYXRSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQkJCVN0cmluZyBydW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IHJ1bnRpbWVUeXBlSWQuc3Vic3RyaW5nKDAsIHJ1bnRpbWVUeXBlSWQubGVuZ3RoKCkgLSA4KTsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotCQkJCXRyeSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlSWQsIG51bGwsIHJ1bnRpbWUsIG1vbml0b3IpOwotCQkJCQlsaXN0ZW5lci5zZXJ2ZXJGb3VuZChzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgY3JlYXRlIFRvbWNhdCBzZXJ2ZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRvbWNhdFJ1bnRpbWVMb2NhdG9yLnNlYXJjaEZvclJ1bnRpbWVzMihudWxsLCBsaXN0ZW5lcjIsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjcyMGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGxvYWQgYW5kIHNhdmUgVG9tY2F0IHNlcnZlciBhbmQgaWRlbnRpZnkgY29uZmlndXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXJVdGlsIHsKLQkvKioKLQkgKiBUb21jYXRTZXJ2ZXJTZXJpYWxpemVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlclV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgYSA8Y29kZT5QYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiBmcm9tIGl0cyA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvcm0uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0Q2xhc3NwYXRoS2luZEZyb21TdHJpbmcoU3RyaW5nIGtpbmRTdHIpIHsKLQkJLy9pZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJwcmoiKSkKLQkJLy8JcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDsKLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgidmFyIikpCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRTsKLQkJLy9pZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJzcmMiKSkKLQkJLy8JcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJsaWIiKSkKLQkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3IgdGhlIGtpbmQgb2YgYSBjbGFzcyBwYXRoIGVudHJ5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENsYXNzcGF0aEtpbmRUb1N0cmluZyhpbnQga2luZCkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCS8vY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJLy8JcmV0dXJuICJwcmoiOwotCQkJLy9jYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCS8vCXJldHVybiAic3JjIjsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gImxpYiI7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCXJldHVybiAidmFyIjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAidW5rbm93biI7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlJ3MgYSBjbGFzc3BhdGggZW50cnkgb2YgdGhlIHNwZWNpZmllZCBraW5kLgotCSAqCi0JICogUmV0dXJucyBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUgYSB2YWxpZCBlbnRyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBjcmVhdGVDbGFzc3BhdGhFbnRyeShJUGF0aCBwYXRoLCBpbnQga2luZCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCS8qY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgpOyovCi0JCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwotCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCXJldHVybiBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwotCQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTdjYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0LklNb2R1bGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0Lk1vZHVsZVRyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQlJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgewotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0KLQkJU291cmNlUGF0aENvbXB1dGVyVmlzaXRvciB2aXNpdG9yID0gbmV3IFNvdXJjZVBhdGhDb21wdXRlclZpc2l0b3IoCi0JCQkJY29uZmlndXJhdGlvbik7Ci0KLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCU1vZHVsZVRyYXZlcnNlci50cmF2ZXJzZShtb2R1bGVzW2ldLCB2aXNpdG9yLCBtb25pdG9yKTsKLQkJfQotCi0JCXJldHVybiB2aXNpdG9yLmdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQl9Ci0KLQljbGFzcyBTb3VyY2VQYXRoQ29tcHV0ZXJWaXNpdG9yIGltcGxlbWVudHMgSU1vZHVsZVZpc2l0b3IgewotCi0JCWZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLQkJLyoqCi0JCSAqIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gb2YgdW5yZXNvbHZlZCBJUnVudGltZUNsYXNzcGF0aEVudHJpZXMKLQkJICovCi0JCUxpc3QgcnVudGltZUNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlTb3VyY2VQYXRoQ29tcHV0ZXJWaXNpdG9yKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJcnVudGltZUNsYXNzcGF0aC5hZGQoSmF2YVJ1bnRpbWUKLQkJCQkJCS5uZXdEZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KGphdmFQcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kVmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCB2aXNpdEFyY2hpdmVDb21wb25lbnQoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCB2aXNpdERlcGVuZGVudENvbXBvbmVudChJUGF0aCBydW50aW1lUGF0aCwKLQkJCQlJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRXZWJSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyB2b2lkIHZpc2l0RWFyUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdEVhckNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpCi0JCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NwYXRoRW50cnkoSVBhdGggcnRGb2xkZXIsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJSVNvdXJjZUNvbnRhaW5lcltdIGdldFNvdXJjZUNvbnRhaW5lcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlydW50aW1lQ2xhc3NwYXRoLmFkZEFsbChBcnJheXMuYXNMaXN0KEphdmFSdW50aW1lCi0JCQkJCS5jb21wdXRlVW5yZXNvbHZlZFNvdXJjZUxvb2t1cFBhdGgoY29uZmlndXJhdGlvbikpKTsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgcnVudGltZUNsYXNzcGF0aAotCQkJCQkudG9BcnJheShuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtydW50aW1lQ2xhc3NwYXRoLnNpemUoKV0pOwotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkID0gSmF2YVJ1bnRpbWUKLQkJCQkJLnJlc29sdmVTb3VyY2VMb29rdXBQYXRoKGVudHJpZXMsIGNvbmZpZ3VyYXRpb24pOwotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFZlcnNpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0VmVyc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2NkZDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0VmVyc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUyBJbnN0aXR1dGUsIEluYyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgU0FTIEluc3RpdHV0ZSwgSW5jIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC53c3QuTW9kdWxlVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkhvc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlckluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbWV0aG9kcyB0aGF0IGFyZSB1c2VkIGJ5IG1vcmUgdGhhdCBvbmUgdmVyc2lvbgotICogb2YgVG9tY2F0LiAgVXNlIG9mIHRoZXNlIG1ldGhvZHMgbWFrZXMgaXQgY2xlYXIgdGhhdCBtb3JlIHRoYW4KLSAqIG9uZSB2ZXJzaW9uIHdpbGwgYmUgaW1wYWN0ZWQgYnkgY2hhbmdlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRWZXJzaW9uSGVscGVyIHsKLQotCS8qKgotCSAqIFN0aW5nIGNvbnRhaW5pbmcgY29udGVudHMgZm9yIGEgZGVmYXVsdCB3ZWIueG1sIGZvciBTZXJ2bGV0IDIuMi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjIgPSAKLQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+XG4iICsKLQkJIjwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyBcIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTlwiIFwiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkXCI+XG4iICsKLQkJIjx3ZWItYXBwPlxuPC93ZWItYXBwPiI7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHdlYi54bWwgY29udGVudHMgZm9yIGEgU2VydmxldCAyLjMgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0VCWE1MX1NFUlZMRVQyMyA9IAotCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiSVNPLTg4NTktMVwiPz5cbiIgKwotCQkiPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDIFwiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOXCIgXCJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGRcIj5cbiIgKwotCQkiPHdlYi1hcHA+XG48L3dlYi1hcHA+IjsKLQotCS8qKgotCSAqIERlZmF1bHQgd2ViLnhtbCBjb250ZW50cyBmb3IgYSBTZXJ2bGV0IDIuNCB3ZWIgYXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJYTUxfU0VSVkxFVDI0ID0gCi0JCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PlxuIiArCi0JCSI8d2ViLWFwcCB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2RcIiB2ZXJzaW9uPVwiMi40XCI+XG4iICsKLQkJIjwvd2ViLWFwcD4iOwotCi0JLyoqCi0JICogRGVmYXVsdCB3ZWIueG1sIGNvbnRlbnRzIGZvciBhIFNlcnZsZXQgMi41IHdlYiBhcHBsaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjUgPQotCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiSVNPLTg4NTktMVwiPz5cbiIgKwotCQkiPHdlYi1hcHAgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4c2k6c2NoZW1hTG9jYXRpb249XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzUueHNkXCIgdmVyc2lvbj1cIjIuNVwiPlxuIiArCi0JCSI8L3dlYi1hcHA+IjsKLQotCS8qKgotCSAqIFJlYWRzIHRoZSBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0gYW5kIHJldHVybnMKLQkgKiB0aGUgcmVzdWx0IGFzIGEgU3RyaW5nLiBFYWNoIGxpbmUgaXMgdGVybWluYXRlZCBieQotCSAqICZxdW90O1xuJnF1b3Q7LiAgUmV0dXJucyB3aGF0ZXZlciBpcyByZWFkIHJlZ2FyZGxlc3MKLQkgKiBvZiBhbnkgZXJyb3JzIHRoYXQgb2NjdXJzIHdoaWxlIHJlYWRpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cmVhbSBJbnB1dFN0cmVhbSBmb3IgdGhlIGNvbnRlbnRzIHRvIGJlIHJlYWQKLQkgKiBAcmV0dXJuIGNvbnRlbnRzIHJlYWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlQ29udGVudHMoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJCVN0cmluZyB0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCQlzYi5hcHBlbmQodGVtcCkuYXBwZW5kKCJcbiIpOwotCQkJCXRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIGZpbGUgY29udGVudHMuIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYnIgIT0gbnVsbCkKLQkJCQlici5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhpcyBzZXJ2ZXIuIFRoaXMgZGlyZWN0b3J5Ci0JICogaXMgdXNlZCBhcyB0aGUgImJhc2UiIHByb3BlcnR5IGZvciB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSB0cyBUb21jYXRTZXJ2ZXIgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIGJhc2UgZGlyZWN0b3J5IAotCSAqIGRpcmVjdG9yeS4gIE9ubHkgdXNlZCB0byBnZXQgdGhlIHRlbXAgZGlyZWN0b3J5IGlmIG5lZWRlZC4KLQkgKiBAcmV0dXJuIHBhdGggdG8gYmFzZSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFN0YW5kYXJkQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIgdHMpIHsKLQkJaWYgKHRzLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCVN0cmluZyBiYXNlRGlyID0gdHMuZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKTsKLQkJCS8vIElmIHRlc3QgbW9kZSBhbmQgbm8gaW5zdGFuY2UgZGlyZWN0b3J5IHNwZWNpZmllZCwgdXNlIHRlbXBvcmFyeSBkaXJlY3RvcnkKLQkJCWlmIChiYXNlRGlyID09IG51bGwpIHsKLQkJCQlUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgdHNiID0gKFRvbWNhdFNlcnZlckJlaGF2aW91cil0cy5nZXRTZXJ2ZXIoKS5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MsIG51bGwpOwotCQkJCXJldHVybiB0c2IuZ2V0VGVtcERpcmVjdG9yeSgpOwotCQkJfQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VEaXIpOwotCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCUlQYXRoIHJvb3RQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJCXBhdGggPSByb290UGF0aC5hcHBlbmQocGF0aCk7Ci0JCQl9Ci0JCQkvLyBSZXR1cm4gc3BlY2lmaWVkIGluc3RhbmNlIGRpcmVjdG9yeQotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJLy8gUmV0dXJuIHJ1bnRpbWUgcGF0aAotCQlyZXR1cm4gdHMuZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhcnR1cCBWTSBhcmd1bWVudHMgZm9yIHRoZSBDYXRhbGluYSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIGluc3RhbGxhdGlvbiBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGluc3RhbmNlUGF0aCBpbnN0YW5jZSBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveVBhdGggZGVwbG95IHBhdGggZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gaXNUZXN0RW52IHRlc3QgZW52aXJvbm1lbnQgZmxhZwotCSAqIEByZXR1cm4gYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIFZNIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2F0YWxpbmFWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggaW5zdGFuY2VQYXRoLCBJUGF0aCBkZXBsb3lQYXRoLCBTdHJpbmcgZW5kb3JzZWREaXJzLCBib29sZWFuIGlzVGVzdEVudikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChpc1Rlc3RFbnYpCi0JCQlsaXN0LmFkZCgiLURjYXRhbGluYS5iYXNlPVwiIiArIGluc3RhbmNlUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJZWxzZSAKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGNhdGFsaW5hLmhvbWU9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCS8vIEluY2x1ZGUgYSBzeXN0ZW0gcHJvcGVydHkgZm9yIHRoZSBjb25maWd1cmFibGUgZGVwbG95IGxvY2F0aW9uCi0JCWxpc3QuYWRkKCItRHd0cC5kZXBsb3k9XCIiICsgZGVwbG95UGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJbGlzdC5hZGQoIi1EamF2YS5lbmRvcnNlZC5kaXJzPVwiIiArIGVuZG9yc2VkRGlycyArICJcIiIpOwotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCQotCS8qKgotCSAqIEdldHMgYSBTZXJ2ZXJJbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2ZXIueG1sLCBTZXJ2aWNlIG5hbWUsCi0JICogYW5kIEhvc3QgbmFtZS4gIFJldHVybnMgbnVsbCBpZiBzZXJ2ZXIueG1sIGRvZXMgbm90IGV4aXN0Ci0JICogb3IgYW4gZXJyb3Igb2NjdXJzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJYbWwgcGF0aCB0byBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXJ2ZXIueG1sIAotCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBuYW1lIG9mIFNlcnZpY2UgdG8gYmUgdXNlZCBieSB0aGlzIGluc3RhbmNlIG9yIG51bGwKLQkgKiBAcGFyYW0gaG9zdE5hbWUgbmFtZSBvZiBIb3N0IHRvIGJlIHVzZWQgYnkgdGhpcyBpbnN0YW5jZSBvciBudWxsCi0JICogQHJldHVybiBTZXJ2ZXJJbnN0YW5jZSBmb3Igc3BlY2lmaWVkIHNlcnZlci54bWwgdXNpbmcgc3BlY2lmaWVkCi0JICogU2VydmljZSBhbmQgSG9zdCBuYW1lcy4gIG51bGwgaWYgc2VydmVyLnhtbCBkb2VzIG5vdCBleGlzdC4KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBzaG91bGQgbm90IG9jY3VyIHNpbmNlIGV4aXN0ZW5jZSBpcyB0ZXN0ZWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgc2VydmVyLnhtbAotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yIGluIHNlcnZlci54bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlckluc3RhbmNlIGdldENhdGFsaW5hU2VydmVySW5zdGFuY2UoSVBhdGggc2VydmVyWG1sLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBob3N0TmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCVNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlID0gbnVsbDsKLQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJRmlsZSBzZXJ2ZXJGaWxlID0gc2VydmVyWG1sLnRvRmlsZSgpOwotCQlpZiAoc2VydmVyRmlsZS5leGlzdHMoKSkgewotCQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyRmlsZSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBzZXJ2aWNlTmFtZSwgaG9zdE5hbWUpOwotCQkJCi0JCQlJUGF0aCBjb250ZXh0UGF0aCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRYbWxEaXJlY3Rvcnkoc2VydmVyWG1sLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCQlGaWxlIGNvbnRleHREaXIgPSBjb250ZXh0UGF0aC50b0ZpbGUoKTsKLQkJCWlmIChjb250ZXh0RGlyLmV4aXN0cygpKSB7Ci0JCQkJTWFwIHByb2plY3RDb250ZXh0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbG9hZFNlcGFyYXRlQ29udGV4dEZpbGVzKGNvbnRleHRQYXRoLnRvRmlsZSgpLCBmYWN0b3J5LCBwcm9qZWN0Q29udGV4dHMpOwotCQkJCQotCQkJCS8vIGFkZCBhbnkgc2VwYXJhdGVseSBzYXZlZCBjb250ZXh0cwotCQkJCUhvc3QgaG9zdCA9IHNlcnZlckluc3RhbmNlLmdldEhvc3QoKTsKLQkJCQlDb2xsZWN0aW9uIGNvbnRleHRzID0gcHJvamVjdENvbnRleHRzLnZhbHVlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dClpdGVyLm5leHQoKTsKLQkJCQkJaG9zdC5pbXBvcnROb2RlKGNvbnRleHQuZ2V0RWxlbWVudE5vZGUoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8vIFRPRE8gQWRkIGhhbmRsaW5nIGZvciBub24tcHJvamVjdCBjb250ZXh0cyB3aGVuIHRoZXJlIHJlbW92YWwgY2FuIGJlIGFkZHJlc3NlZCAgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhdGhzIGZvciBDb250ZXh0cyB0aGF0IGFyZSBiZWluZyByZW1vdmVkIGluIHRoZQotCSAqIG5leHQgc2VydmVyIHB1Ymxpc2guIFJlYWRzIHRoZSBvbGQgc2VydmVyLnhtbCB0byBkZXRlcm1pbmUKLQkgKiB3aGF0IENvbnRleHRzIHdlcmUgcHJldmlvdXNseSBzZXJ2ZXJlZCBhbmQgcmV0dXJucyB0aG9zZQotCSAqIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbW9kdWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkU2VydmVySW5zdGFuY2UgZm9yIHNlcnZlci54bWwgZnJvbSBwcmV2aW91cyBzZXJ2ZXIgcHVibGlzaAotCSAqIEBwYXJhbSBtb2R1bGVzIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIG1vZHVsZXMKLQkgKiBAcGFyYW0gcmVtb3ZlZENvbnRleHRzTWFwIE1hcCB0byByZWNlaXZlIHJlbW92ZWQgY29udGV4dHMgbWFwcGVkIGJ5IHBhdGgKLQkgKiBAcGFyYW0ga2VwdENvbnRleHRzTWFwIE1hcCB0byByZWNlaXZlIGtlcHQgY29udGV4dHMgbWFwcGVkIGJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVtb3ZlZEtlcHRDYXRhbGluYUNvbnRleHRzKFNlcnZlckluc3RhbmNlIG9sZFNlcnZlckluc3RhbmNlLAotCQkJTGlzdCBtb2R1bGVzLCBNYXAgcmVtb3ZlZENvbnRleHRzTWFwLCBNYXAga2VwdENvbnRleHRzTWFwKSB7Ci0JCS8vIENvbGxlY3QgcGF0aHMgb2Ygb2xkIHdlYiBtb2R1bGVzIG1hbmFnZWQgYnkgV1RQCi0JCUNvbnRleHQgW10gY29udGV4dHMgPSBvbGRTZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0c1tpXS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCXsKLQkJCQkJcmVtb3ZlZENvbnRleHRzTWFwLnB1dChjb250ZXh0c1tpXS5nZXRQYXRoKCksIGNvbnRleHRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgcGF0aHMgZm9yIHdlYiBtb2R1bGVzIHRoYXQgYXJlIHN0YXlpbmcgYXJvdW5kCi0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dClyZW1vdmVkQ29udGV4dHNNYXAucmVtb3ZlKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCQlrZXB0Q29udGV4dHNNYXAucHV0KGNvbnRleHQuZ2V0UGF0aCgpLCBjb250ZXh0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDbGVhbnVwIHNlcnZlciBpbnN0YW5jZSBsb2NhdGlvbiBpbiBwcmVwYXJhdGlvbiBmb3IgbmV4dCBzZXJ2ZXIgcHVibGlzaC4KLQkgKiBUaGlzIGN1cnJlbnRseSBpbnZvbHZlcyBkZWxldGluZyB3b3JrIGRpcmVjdG9yaWVzIGZvciBjdXJyZW50bHkKLQkgKiBleGlzdGluZyBDb250ZXh0cyB3aGljaCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbmV4dCBwdWJsaXNoLgotCSAqIEluIGFkZGl0aW9uLCBDb250ZXh0IFhNTCBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIHRoZXNlCi0JICogQ29udGV4dHMgYXJlIGFsc28gZGVsZXRlZC4gSWYgcmVxdWVzdGVkLCBDb250ZXh0IFhNTCBmaWxlcyBmb3IKLQkgKiBrZXB0IENvbnRleHRzIHdpbGwgYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdpbGwgYmUga2VwdCBpbiBzZXJ2ZXIueG1sLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbmNlIGRpcmVjdG9yeSwgaS5lLiBjYXRhbGluYS5iYXNlCi0JICogQHBhcmFtIGluc3RhbGxEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAobm90IGN1cnJlbnRseSB1c2VkKQotCSAqIEBwYXJhbSByZW1vdmVLZXB0Q29udGV4dEZpbGVzIHRydWUgaWYga2VwdCBjb250ZXh0cyBzaG91bGQgaGF2ZSBhIHNlcGFyYXRlCi0JICogIGNvbnRleHQgWE1MIGZpbGUgcmVtb3ZlZCAKLQkgKiBAcGFyYW0gbW9kdWxlcyBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBtb2R1bGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIE11bHRpU3RhdHVzIGNvbnRhaW5pbmcgcmVzdWx0cyBvZiB0aGUgY2xlYW51cCBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2xlYW51cENhdGFsaW5hU2VydmVyKElQYXRoIGJhc2VEaXIsIElQYXRoIGluc3RhbGxEaXIsIGJvb2xlYW4gcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgTGlzdCBtb2R1bGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuY2xlYW51cFNlcnZlclRhc2ssIG51bGwpOwotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuY2xlYW51cFNlcnZlclRhc2ssIDIwMCk7Ci0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZGV0ZWN0aW5nUmVtb3ZlZFByb2plY3RzKTsKLQotCQkJSVBhdGggc2VydmVyWG1sID0gYmFzZURpci5hcHBlbmQoImNvbmYiKS5hcHBlbmQoInNlcnZlci54bWwiKTsKLQkJCVNlcnZlckluc3RhbmNlIG9sZEluc3RhbmNlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRDYXRhbGluYVNlcnZlckluc3RhbmNlKHNlcnZlclhtbCwgbnVsbCwgbnVsbCk7Ci0JCQlpZiAob2xkSW5zdGFuY2UgIT0gbnVsbCkgewotCQkJCU1hcCByZW1vdmVkQ29udGV4dHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCU1hcCBrZXB0Q29udGV4dHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCVRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0UmVtb3ZlZEtlcHRDYXRhbGluYUNvbnRleHRzKG9sZEluc3RhbmNlLCBtb2R1bGVzLCByZW1vdmVkQ29udGV4dHNNYXAsIGtlcHRDb250ZXh0c01hcCk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQlpZiAocmVtb3ZlZENvbnRleHRzTWFwLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gRGVsZXRlIGNvbnRleHQgZmlsZXMgYW5kIHdvcmsgZGlyZWN0b3JpZXMgZm9yIG1hbmFnZWQgd2ViIG1vZHVsZXMgdGhhdCBoYXZlIGdvbmUgYXdheQotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApOwotCQkJCQlzdWJNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5kZWxldGluZ0NvbnRleHRGaWxlc1Rhc2ssIHJlbW92ZWRDb250ZXh0c01hcC5zaXplKCkgKiAyMDApOwotCQkJCQkKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRDb250ZXh0c01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBvbGRQYXRoID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQkJCUNvbnRleHQgY3R4ID0gKENvbnRleHQpcmVtb3ZlZENvbnRleHRzTWFwLmdldChvbGRQYXRoKTsKLQkJCQkJCQotCQkJCQkJLy8gRGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRleHQgZmlsZSwgaWYgaXQgZXhpc3RzCi0JCQkJCQlJUGF0aCBjdHhGaWxlUGF0aCA9IG9sZEluc3RhbmNlLmdldENvbnRleHRGaWxlUGF0aChiYXNlRGlyLCBjdHgpOwotCQkJCQkJaWYgKGN0eEZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJCQlGaWxlIGN0eEZpbGUgPSBjdHhGaWxlUGF0aC50b0ZpbGUoKTsKLQkJCQkJCQlpZiAoY3R4RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlzdWJNb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZSwgY3R4RmlsZS5nZXROYW1lKCkpKTsKLQkJCQkJCQkJaWYgKGN0eEZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJCQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTGVmdG92ZXIgY29udGV4dCBmaWxlICIgKyBjdHhGaWxlLmdldE5hbWUoKSArICIgZGVsZXRlZC4iKTsKLQkJCQkJCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZWRDb250ZXh0RmlsZSwgY3R4RmlsZS5nZXROYW1lKCkpLCBudWxsKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZGVsZXRlIG9ic29sZXRlIGNvbnRleHQgZmlsZSAiICsgY3R4RmlsZVBhdGgudG9PU1N0cmluZygpKTsKLQkJCQkJCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3REZWxldGVDb250ZXh0RmlsZSwgY3R4RmlsZVBhdGgudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc3ViTW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkJCQotCQkJCQkJLy8gRGVsZXRlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3ZlZCBjb250ZXh0IGlmIGl0IGlzIHdpdGhpbiBjb25mRGlyLgotCQkJCQkJLy8gSWYgaXQgaXMgb3V0c2lkZSBvZiBjb25mRGlyLCBhc3N1bWUgdXNlciBpcyBnb2luZyB0byBtYW5hZ2UgaXQuCi0JCQkJCQlJUGF0aCBjdHhXb3JrUGF0aCA9IG9sZEluc3RhbmNlLmdldENvbnRleHRXb3JrRGlyZWN0b3J5KGJhc2VEaXIsIGN0eCk7Ci0JCQkJCQlpZiAoYmFzZURpci5pc1ByZWZpeE9mKGN0eFdvcmtQYXRoKSkgewotCQkJCQkJCUZpbGUgY3R4V29ya0RpciA9IGN0eFdvcmtQYXRoLnRvRmlsZSgpOwotCQkJCQkJCWlmIChjdHhXb3JrRGlyLmV4aXN0cygpICYmIGN0eFdvcmtEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJCQlJU3RhdHVzIFtdIHJlc3VsdHMgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShjdHhXb3JrRGlyLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJCQkJCQkJaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGRlbGV0ZSB3b3JrIGRpcmVjdG9yeSAiICsgY3R4V29ya0Rpci5nZXRQYXRoKCkgKyAiIGZvciByZW1vdmVkIGNvbnRleHQgIiArIG9sZFBhdGgpOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJbXMuYWRkKHJlc3VsdHNbaV0pOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQkJc3ViTW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlzdWJNb25pdG9yLndvcmtlZCgxMDApOwotCQkJCQl9Ci0JCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCQotCQkJCS8vIElmIHJlcXVlc3RlZCwgcmVtb3ZlIGFueSBzZXBhcmF0ZSBjb250ZXh0IFhNTCBmaWxlcyBmb3IgY29udGV4dHMgYmVpbmcga2VwdAotCQkJCWlmIChyZW1vdmVLZXB0Q29udGV4dEZpbGVzICYmIGtlcHRDb250ZXh0c01hcC5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIERlbGV0ZSBjb250ZXh0IGZpbGVzIGFuZCB3b3JrIGRpcmVjdG9yaWVzIGZvciBtYW5hZ2VkIHdlYiBtb2R1bGVzIHRoYXQgaGF2ZSBnb25lIGF3YXkKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKTsKLQkJCQkJLy8gVE9ETyBJbXByb3ZlIHRhc2sgbmFtZQotCQkJCQlzdWJNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5kZWxldGluZ0NvbnRleHRGaWxlc1Rhc2ssIGtlcHRDb250ZXh0c01hcC5zaXplKCkgKiAxMDApOwotCQkJCQkKLQkJCQkJSXRlcmF0b3IgaXRlciA9IGtlcHRDb250ZXh0c01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBrZXB0UGF0aCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KWtlcHRDb250ZXh0c01hcC5nZXQoa2VwdFBhdGgpOwotCQkJCQkJCi0JCQkJCQkvLyBEZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcgY29udGV4dCBmaWxlLCBpZiBpdCBleGlzdHMKLQkJCQkJCUlQYXRoIGN0eEZpbGVQYXRoID0gb2xkSW5zdGFuY2UuZ2V0Q29udGV4dEZpbGVQYXRoKGJhc2VEaXIsIGN0eCk7Ci0JCQkJCQlpZiAoY3R4RmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJCUZpbGUgY3R4RmlsZSA9IGN0eEZpbGVQYXRoLnRvRmlsZSgpOwotCQkJCQkJCWlmIChjdHhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXN1Yk1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5kZWxldGluZ0NvbnRleHRGaWxlLCBjdHhGaWxlLmdldE5hbWUoKSkpOwotCQkJCQkJCQlpZiAoY3R4RmlsZS5kZWxldGUoKSkgewotCQkJCQkJCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMZWZ0b3ZlciBjb250ZXh0IGZpbGUgIiArIGN0eEZpbGUuZ2V0TmFtZSgpICsgIiBkZWxldGVkLiIpOwotCQkJCQkJCQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRlZENvbnRleHRGaWxlLCBjdHhGaWxlLmdldE5hbWUoKSksIG51bGwpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBkZWxldGUgb2Jzb2xldGUgY29udGV4dCBmaWxlICIgKyBjdHhGaWxlUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCQkJCQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdERlbGV0ZUNvbnRleHRGaWxlLCBjdHhGaWxlUGF0aC50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzdWJNb25pdG9yLndvcmtlZCgxMDApOwotCQkJCQl9Ci0JCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEVsc2Ugbm8gc2VydmVyLnhtbC4gIEFzc3VtZSBmaXJzdCBwdWJsaXNoIHRvIG5ldyB0ZW1wIGRpcmVjdG9yeQotCQkJZWxzZSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0KLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU2VydmVyIGNsZWFuZWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjbGVhbnVwIHNlcnZlciBhdCAiICsgYmFzZURpci50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDbGVhbnVwU2VydmVyLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENhdGFsaW5hIGluc3RhbmNlIGRpcmVjdG9yeSBhdCB0aGUgc3BlY2lmaWVkCi0JICogcGF0aC4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgdGhlIHNldCBvZiBzdWJkaXJlY3RvcmllcwotCSAqIHVzZXMgYnkgYSBDYXRhbGluYSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBkaXJlY3RvcnkgYXQgd2hpY2ggdG8gY3JlYXRlIENhdGFsaW5hIGluc3RhbmNlCi0JICogZGlyZWN0b3JpZXMuCi0JICogQHJldHVybiByZXN1bHQgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlQ2F0YWxpbmFJbnN0YW5jZURpcmVjdG9yeShJUGF0aCBiYXNlRGlyKSB7Ci0JCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDcmVhdGluZyBydW50aW1lIGRpcmVjdG9yeSBhdCAiICsgYmFzZURpci50b09TU3RyaW5nKCkpOwotCQkvLyBUT0RPIEFkZCBtb3JlIGVycm9yIGhhbmRsaW5nLgotCQkvLyBQcmVwYXJlIGEgY2F0YWxpbmEuYmFzZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi0JCUZpbGUgdGVtcCA9IGJhc2VEaXIuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBiYXNlRGlyLmFwcGVuZCgibG9ncyIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gYmFzZURpci5hcHBlbmQoInRlbXAiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IGJhc2VEaXIuYXBwZW5kKCJ3ZWJhcHBzIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBiYXNlRGlyLmFwcGVuZCgid29yayIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNwZWNpZmllZCBkZXBsb3ltZW50IGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSAqIEl0IHdpbGwgaW5jbHVkZSBhIGRlZmF1bHQgUk9PVCB3ZWIgYXBwbGljYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCB3ZWIueG1sLgotCSAqIAotCSAqIEBwYXJhbSBkZXBsb3lEaXIgcGF0aCB0byBkZXBsb3ltZW50IGRpcmVjdG9yeSB0byBjcmVhdGUKLQkgKiBAcGFyYW0gd2VieG1sIHdlYi54bWwgY29udGV4dCB0byB1c2UgZm9yIHRoZSBST09UIHdlYiBhcHBsaWNhdGlvbi4KLQkgKiBAcmV0dXJuIHJlc3VsdCBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVEZXBsb3ltZW50RGlyZWN0b3J5KElQYXRoIGRlcGxveURpciwgU3RyaW5nIHdlYnhtbCkgewotCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ3JlYXRpbmcgZGVwbG95bWVudCBkaXJlY3RvcnkgYXQgIiArIGRlcGxveURpci50b09TU3RyaW5nKCkpOwotCi0JCS8vIFRPRE8gQWRkIG1vcmUgZXJyb3IgaGFuZGxpbmcuCi0JCUZpbGUgdGVtcCA9IGRlcGxveURpci50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQotCQlJUGF0aCB0ZW1wUGF0aCA9IGRlcGxveURpci5hcHBlbmQoIlJPT1QvV0VCLUlORiIpOwotCQl0ZW1wID0gdGVtcFBhdGgudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSB0ZW1wUGF0aC5hcHBlbmQoIndlYi54bWwiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKSB7Ci0JCQlGaWxlV3JpdGVyIGZ3OwotCQkJdHJ5IHsKLQkJCQlmdyA9IG5ldyBGaWxlV3JpdGVyKHRlbXApOwotCQkJCWZ3LndyaXRlKHdlYnhtbCk7Ci0JCQkJZncuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiVW5hYmxlIHRvIGNyZWF0ZSB3ZWIueG1sIGZvciBST09UIGNvbnRleHQuIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwkJCi0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlcwotCSAqIHByZXNlbnQgaW4gcHJvamVjdHMgdG8gcHVibGlzaGVkIHNlcnZlci54bWwuICBVc2VkIGJ5Ci0JICogVG9tY2F0IDQuMSwgNS4wLCBhbmQgNS41IHdoaWNoIHN1cHBvcnQgdXNlIG9mIE1FVEEtSU5GL2NvbnRleHQueG1sCi0JICogaW4gc29tZSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIGFic29sdXRlIHBhdGggdG8gY2F0YWxpbmEgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIHdlYmFwcHNEaXIgYWJzb2x1dGUgcGF0aCB0byBkZXBsb3ltZW50IGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiByZXN1bHQgb2Ygb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHB1Ymxpc2hDYXRhbGluYUNvbnRleHRDb25maWcoSVBhdGggYmFzZURpciwgSVBhdGggd2ViYXBwc0RpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucHVibGlzaENvbmZpZ3VyYXRpb25UYXNrLCAzMDApOwotCi0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMucHVibGlzaENvbnRleHRDb25maWdUYXNrKTsKLQkJCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJU2VydmVyIHB1Ymxpc2hlZFNlcnZlciA9IChTZXJ2ZXIpIGZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0oY29uZkRpci5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJU2VydmVySW5zdGFuY2UgcHVibGlzaGVkSW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2UocHVibGlzaGVkU2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQotCQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaENvbnRleHRDb25maWdUYXNrLCBudWxsKTsKLQkJCUNvbnRleHQgW10gY29udGV4dHMgPSBwdWJsaXNoZWRJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY2hlY2tpbmdDb250ZXh0VGFzaywKLQkJCQkJCQluZXcgU3RyaW5nW10ge2NvbnRleHQuZ2V0UGF0aCgpfSkpOwotCQkJCQlpZiAoYWRkQ2F0YWxpbmFDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIsIGNvbnRleHQsIG1zKSkgewotCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCWlmIChtb2RpZmllZCkgewotCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5zYXZpbmdDb250ZXh0Q29uZmlnVGFzayk7Ci0JCQkJZmFjdG9yeS5zYXZlKGNvbmZEaXIuYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJCQotCQkJLy8gSWYgcHJvYmxlbShzKSBvY2N1cnJlZCBhZGRpbmcgY29udGV4dCBjb25maWd1cmF0aW9ucywgcmV0dXJuIGVycm9yIHN0YXR1cwotCQkJaWYgKG1zLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiBtczsKLQkJCX0KLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU2VydmVyLnhtbCB1cGRhdGVkIHdpdGggY29udGV4dC54bWwgY29uZmlndXJhdGlvbnMiKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBhcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIHRvIHB1Ymxpc2hlZCBUb21jYXQgY29uZmlndXJhdGlvbiBmcm9tICIgKyBjb25mRGlyLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIENvbnRleHQgaXMgbGlua2VkIHRvIGEgcHJvamVjdCwgdHJ5IHRvCi0JICogdXBkYXRlIGl0IHdpdGggYW55IGNvbmZpZ3VyYXRpb24gZnJvbSBhIE1FVEEtSU5GL2NvbnRleHQueG1sIGZvdW5kCi0JICogcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb25zIGRpcmVjdG9yeSBhbmQgY29udGV4dCBkb2NCYXNlLgotCSAqIAotCSAqIEBwYXJhbSB3ZWJhcHBzRGlyIFBhdGggdG8gc2VydmVyJ3Mgd2ViIGFwcGxpY2F0aW9ucyBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvYmplY3QgdG8gcmVjZWl2ZSBjb250ZXh0LnhtbCBjb250ZW50cy4KLQkgKiBAcGFyYW0gbXMgTXVsdGlTdGF0dXMgb2JqZWN0IHRvIHJlY2VpdmUgZXJyb3Igc3RhdHVzLgotCSAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGNvbnRleHQgaXMgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhZGRDYXRhbGluYUNvbnRleHRDb25maWcoSVBhdGggd2ViYXBwc0RpciwgQ29udGV4dCBjb250ZXh0LCBNdWx0aVN0YXR1cyBtcykgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCi0JCXsKLQkJCUZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKLQkJCWlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpCi0JCQkJZG9jQmFzZSA9IG5ldyBGaWxlKHdlYmFwcHNEaXIudG9PU1N0cmluZygpLCBkb2NCYXNlLmdldFBhdGgoKSk7Ci0JCQl0cnkgewotCQkJCUNvbnRleHQgY29udGV4dENvbmZpZyA9IGxvYWRDYXRhbGluYUNvbnRleHRDb25maWcoZG9jQmFzZSk7Ci0JCQkJaWYgKG51bGwgIT0gY29udGV4dENvbmZpZykgewotCQkJCQlpZiAoY29udGV4dC5oYXNDaGlsZE5vZGVzKCkpCi0JCQkJCQljb250ZXh0LnJlbW92ZUNoaWxkcmVuKCk7Ci0JCQkJCWNvbnRleHRDb25maWcuY29weUNoaWxkcmVuVG8oY29udGV4dCk7Ci0JCQkJCU1hcCBhdHRycyA9IGNvbnRleHRDb25maWcuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlJdGVyYXRvciBpdGVyID0gYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKCFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhdGgiKQotCQkJCQkJCQkmJiAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJkb2NCYXNlIikKLQkJCQkJCQkJJiYgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic291cmNlIikpIHsKLQkJCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWF0dHJzLmdldChuYW1lKTsKLQkJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZVZhbHVlKG5hbWUsIHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKLQkJCQlpZiAoY29udGV4dFBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQkJCWNvbnRleHRQYXRoID0gY29udGV4dFBhdGguc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZWFkaW5nIGNvbnRleHQueG1sIGZpbGUgZm9yICIgKyBjb250ZXh0UGF0aCwgZSk7Ci0JCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb250ZXh0WG1sLCBjb250ZXh0UGF0aCksIGUpOwotCQkJCW1zLmFkZChzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCQotCS8qKgotCSAqIFRyaWVzIHRvIHJlYWQgYSBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlIHJlbGF0aXZlIHRvIHRoZQotCSAqIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb24gcGF0aC4gIElmIGZvdW5kLCBpdCBjcmVhdGVzIGEgQ29udGV4dCBvYmplY3QKLQkgKiBjb250YWluaW5nIHRoZSBjb250ZXh0cyBvZiB0aGF0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIGRvY0Jhc2UgRmlsZSB3aXRoIGFic29sdXRlIHBhdGggdG8gdGhlIHdlYiBhcHBsaWNhdGlvbgotCSAqIEByZXR1cm4gQ29udGV4dCBlbGVtZW50IGNyZWF0ZWQgZnJvbSBjb250ZXh0LnhtbCwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBlcnJvciBwYXJzaW5nIHRoZSBYTUwuIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb250ZXh0IGxvYWRDYXRhbGluYUNvbnRleHRDb25maWcoRmlsZSBkb2NCYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCUZpbGUgY29udGV4dFhNTCA9IG5ldyBGaWxlKGRvY0Jhc2UsICJNRVRBLUlORiIgKyBGaWxlLnNlcGFyYXRvciArICJjb250ZXh0LnhtbCIpOwotCQlpZiAoY29udGV4dFhNTC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY29udGV4dFhNTCk7Ci0JCQkJRmFjdG9yeSBjdHhGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCQljdHhGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJCUNvbnRleHQgY3R4ID0gKENvbnRleHQpY3R4RmFjdG9yeS5sb2FkRG9jdW1lbnQoaXMpOwotCQkJCWlzLmNsb3NlKCk7Ci0JCQkJcmV0dXJuIGN0eDsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlLCBzaG91bGQgbmV2ZXIgb2NjdXIKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAJfQotCQotCS8qKgotCSAqIElmIG1vZHVsZXMgYXJlIG5vdCBiZWluZyBkZXBsb3llZCB0byB0aGUgIndlYmFwcHMiIGRpcmVjdG9yeSwgdGhlCi0JICogY29udGV4dCBmb3IgdGhlIHB1Ymxpc2hlZCBtb2R1bGVzIGlzIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUKLQkgKiBjb3JyZWN0ZWQgZG9jQmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBydW50aW1lIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveURpciBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2ZXIgc2VydmVyIGJlaW5nIGxvY2FsaXplZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTG9jYWxpemluZyBjb25maWd1cmF0aW9uIGF0ICIgKyBiYXNlRGlyKTsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb25maWd1cmF0aW9uVGFzaywgMzAwKTsKLQotCQkJSVBhdGggc2VydmVyWG1sID0gYmFzZURpci5hcHBlbmQoImNvbmYvc2VydmVyLnhtbCIpOwotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlTZXJ2ZXIgcHVibGlzaGVkU2VydmVyID0gKFNlcnZlcilmYWN0b3J5LmxvYWREb2N1bWVudCgKLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShzZXJ2ZXJYbWwudG9GaWxlKCkpKTsKLQkJCVNlcnZlckluc3RhbmNlIHB1Ymxpc2hlZEluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHB1Ymxpc2hlZFNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCS8vIE9ubHkgYWRkIHJvb3QgbW9kdWxlIGlmIHJ1bm5pbmcgaW4gYSB0ZXN0IGVudiAoaS5lLiBub3Qgb24gdGhlIGluc3RhbGxhdGlvbikKLQkJCWJvb2xlYW4gYWRkUm9vdFdlYmFwcCA9IHNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpOwotCQkJCi0JCQkvLyBJZiBub3QgZGVwbG95aW5nIHRvICJ3ZWJhcHBzIiwgY29udGV4dCBkb2NCYXNlIGF0dHJpYnV0ZXMgbmVlZCB1cGRhdGluZwotCQkJLy8gVE9ETyBJbXByb3ZlIHRvIGNvbXBhcmUgd2l0aCBhcHBCYXNlIHZhbHVlIGluc3RlYWQgb2YgaGFyZGNvZGVkICJ3ZWJhcHBzIgotCQkJYm9vbGVhbiBkZXBsb3lpbmdUb0FwcEJhc2UgPSAid2ViYXBwcyIuZXF1YWxzKHNlcnZlci5nZXREZXBsb3lEaXJlY3RvcnkoKSk7Ci0JCQkKLQkJCU1hcCBwYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaFNlcnZlciwgc2VydmVyLmdldFNlcnZlcigpLmdldE5hbWUoKSksIG51bGwpOwotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHB1Ymxpc2hlZEluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCS8vIE5vcm1hbGl6ZSBwYXRoIGFuZCBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBTYXZlIGEgY29weSBvZiBvcmlnaW5hbCBpbiBjYXNlIGl0J3MgIi8iCi0JCQkJCQlTdHJpbmcgb3JpZ1BhdGggPSBwYXRoOwotCQkJCQkJLy8gTm9ybWFsaXplICIvIiB0byAiIgotCQkJCQkJaWYgKCIvIi5lcXVhbHMocGF0aCkpIHsKLQkJCQkJCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb250ZXh0IHBhdGggaXMgYmVpbmcgY2hhbmdlZCBmcm9tIFwiL1wiIHRvIFwiXCIuIik7Ci0JCQkJCQkJcGF0aCA9ICIiOwotCQkJCQkJCWNvbnRleHQuc2V0UGF0aChwYXRoKTsKLQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIENvbnRleHQgcGF0aHMgdGhhdCBhcmUgdGhlIHNhbWUgb3IgZGlmZmVyIG9ubHkgaW4gY2FzZSBhcmUgbm90IGFsbG93ZWQKLQkJCQkJCVN0cmluZyBsY1BhdGggPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCQlpZiAoIXBhdGhNYXAuY29udGFpbnNLZXkobGNQYXRoKSkgewotCQkJCQkJCXBhdGhNYXAucHV0KGxjUGF0aCwgb3JpZ1BhdGgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG90aGVyUGF0aCA9IChTdHJpbmcpcGF0aE1hcC5nZXQobGNQYXRoKTsKLQkJCQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCQlvcmlnUGF0aC5lcXVhbHMob3RoZXJQYXRoKSA/IE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaFBhdGhEdXAsIG9yaWdQYXRoKSAKLQkJCQkJCQkJCQkJOiBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoQ29uZmxpY3QsIG9yaWdQYXRoLCBvdGhlclBhdGgpKTsKLQkJCQkJCQltcy5hZGQocyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCU1lc3NhZ2VzLmVycm9yUHVibGlzaFBhdGhNaXNzaW5nKTsKLQkJCQkJCW1zLmFkZChzKTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIGRlZmF1bHQgd2ViYXBwIGhhcyBub3QgYmVlbiBmb3VuZCwgY2hlY2sgdGhpcyBvbmUKLQkJCQkJLy8gVE9ETyBOZWVkIHRvIGFkZCBhIHJvb3QgY29udGV4dCBpZiBkZXBsb3lpbmcgdG8gd2ViYXBwcyBidXQgd2l0aCBhdXRvLWRlcGxveSBvZmYKLQkJCQkJaWYgKGFkZFJvb3RXZWJhcHAgJiYgIiIuZXF1YWxzKGNvbnRleHQuZ2V0UGF0aCgpKSkgewotCQkJCQkJLy8gQSBkZWZhdWx0IHdlYmFwcCBpcyBiZWluZyBkZXBsb3llZCwgZG9uJ3QgYWRkIG9uZQotCQkJCQkJYWRkUm9vdFdlYmFwcCA9IGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgbm90IGRlcGxveWluZyB0byBhcHBCYXNlLCBjb252ZXJ0IHRvIGFic29sdXRlIHBhdGggdW5kZXIgZGVwbG95IGRpcgotCQkJCQlpZiAoIWRlcGxveWluZ1RvQXBwQmFzZSkgewotCQkJCQkJU3RyaW5nIHNvdXJjZSA9IGNvbnRleHQuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCXsKLQkJCQkJCQljb250ZXh0LnNldERvY0Jhc2UoZGVwbG95RGlyLmFwcGVuZChjb250ZXh0LmdldERvY0Jhc2UoKSkudG9PU1N0cmluZygpKTsKLQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJZiBlcnJvcnMgYXJlIHByZXNlbnQsIHJldHVybiBzdGF0dXMKLQkJCWlmICghbXMuaXNPSygpKQotCQkJCXJldHVybiBtczsKLQkJCQotCQkJaWYgKGFkZFJvb3RXZWJhcHApIHsKLQkJCQkvLyBBZGQgYSBjb250ZXh0IGZvciB0aGUgZGVmYXVsdCB3ZWJhcHAKLQkJCQlDb250ZXh0IHJvb3RDb250ZXh0ID0gcHVibGlzaGVkSW5zdGFuY2UuY3JlYXRlQ29udGV4dCgwKTsKLQkJCQlyb290Q29udGV4dC5zZXRQYXRoKCIiKTsKLQkJCQlyb290Q29udGV4dC5zZXREb2NCYXNlKGRlcGxveURpci5hcHBlbmQoIlJPT1QiKS50b09TU3RyaW5nKCkpOwotCQkJCXJvb3RDb250ZXh0LnNldFJlbG9hZGFibGUoImZhbHNlIik7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLnNhdmluZ0NvbnRleHRDb25maWdUYXNrKTsKLQkJCQlmYWN0b3J5LnNhdmUoc2VydmVyWG1sLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb250ZXh0IGRvY0Jhc2Ugc2V0dGluZ3MgdXBkYXRlZCBpbiBzZXJ2ZXIueG1sLiIpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2NhbGl6ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBwdWJsaXNoZWQgdG8gIiArIGJhc2VEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBjdXN0b20gbG9hZGVyIGphciByZXF1aXJlZCB0byBzZXJ2ZSBwcm9qZWN0cyB3aXRob3V0Ci0JICogcHVibGlzaGluZyB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdERpciBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIHRoZSBsb2FkZXIgamFyCi0JICogQHBhcmFtIHNlcnZlcklkIElEIG9mIHRoZSBzZXJ2ZXIgcmVjZWl2aW5nIHRoZSBqYXIKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBjb3B5IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjb3B5TG9hZGVySmFyKElQYXRoIGRlc3REaXIsIFN0cmluZyBzZXJ2ZXJJZCkgewotICAgICAgICBTdHJpbmcgbG9hZGVySmFyID0gIi8iICsgc2VydmVySWQgKyAiLmxvYWRlci5qYXIiOwotICAgICAgICBVUkwgaW5zdGFsbFVSTCA9IFRvbWNhdFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KGxvYWRlckphcik7Ci0gICAgICAgIGlmIChpbnN0YWxsVVJMID09IG51bGwpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkxvYWRlciBqYXIgbm90IGZvdW5kIGZvciBzZXJ2ZXIgSUQgIiArIHNlcnZlcklkKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaExvYWRlckphck5vdEZvdW5kLCBzZXJ2ZXJJZCksIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIAkKLSAgICAgICAgVVJMIGxvY2FsVVJMOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9jYWxVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoaW5zdGFsbFVSTCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjb252ZXJ0ICIgKyBpbnN0YWxsVVJMLnRvU3RyaW5nKCkgKyAiIHRvIGZpbGUgVVJMOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoVVJMQ29udmVydCwKLQkJCQkJbmV3IFN0cmluZ1tdIHtpbnN0YWxsVVJMLnRvU3RyaW5nKCksIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotICAgICAgICB9Ci0JCQotICAgICAgICBkZXN0RGlyLnRvRmlsZSgpLm1rZGlycygpOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IEZpbGVVdGlsLmNvcHlGaWxlKGxvY2FsVVJMLCBkZXN0RGlyLmFwcGVuZChsb2FkZXJKYXIpLnRvU3RyaW5nKCkpOyAgICAgICAgCi0gICAgICAgIAotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKioKLQkgKiBUcmllcyB0byBkZWxldGUgdGhlIGN1c3RvbSBsb2FkZXIgamFyIGFkZGVkIHRvIHN1cHBvcnQgc2VydmluZyBwcm9qZWN0cyBkaXJlY3RseQotCSAqIHdpdGhvdXQgcHVibGlzaGluZy4gIFJldHVybnMgYSB3YXJuaW5nIGlmIG5vdCBzdWNjZXNzZnVsLgotCSAqICAKLQkgKiBAcGFyYW0gZGVzdERpciBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbG9hZGVyIGphcgotCSAqIEBwYXJhbSBzZXJ2ZXJJZCBJRCBvZiB0aGUgc2VydmVyIGZyb20gd2hpY2ggdG8gZGVsZXRlIHRoZSBqYXIKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBjb3B5IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyByZW1vdmVMb2FkZXJKYXIoSVBhdGggZGVzdERpciwgU3RyaW5nIHNlcnZlcklkKSB7Ci0gICAgICAgIFN0cmluZyBsb2FkZXJKYXIgPSAiLyIgKyBzZXJ2ZXJJZCArICIubG9hZGVyLmphciI7Ci0gICAgICAgIEZpbGUgbG9hZGVyRmlsZSA9IGRlc3REaXIuYXBwZW5kKGxvYWRlckphcikudG9GaWxlKCk7Ci0gICAgICAgIC8vIElmIGxvYWRlciBqYXIgZXhpc3RzIGJ1dCBpcyBub3Qgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsIHJldHVybiB3YXJuaW5nCi0gICAgICAgIGlmIChsb2FkZXJGaWxlLmV4aXN0cygpICYmICFsb2FkZXJGaWxlLmRlbGV0ZSgpKQotICAgICAgICAJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotICAgICAgICAJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDYW50RGVsZXRlTG9hZGVySmFyLCBsb2FkZXJGaWxlLmdldFBhdGgoKSksIG51bGwpOwotCi0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjYXRhbGluYS5wcm9wZXJ0aWVzIGZpbGUgdG8gaW5jbHVkZSBhIGV4dHJhIGVudHJ5IGluIHRoZQotCSAqIHNwZWNpZmllZCBsb2FkZXIgcHJvcGVydHkgdG8gcGlja3VwIHRoZSBsb2FkZXIgamFyLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIGRpcmVjdG9yeSB3aGVyZSB0aGUgQ2F0YWxpbmEgaW5zdGFuY2UgaXMgZm91bmQKLQkgKiBAcGFyYW0gamFyTG9jIGxvY2F0aW9uIG9mIGxvYWRlciBqYXIgcmVsYXRpdmUgdG8gYmFzZURpcgotCSAqIEBwYXJhbSBsb2FkZXIgbG9hZGVyIGluIGNhdGFsaW5hLnByb3BlcnRpZXMgdG8gdXNlCi0JICogQHJldHVybiByZXN1bHQgb2YgdXBkYXRlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB1cGRhdGVQcm9wZXJ0aWVzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBqYXJMb2MsIFN0cmluZyBsb2FkZXIpIHsKLSAgICAgICAgICAgIEZpbGUgY2F0YWxpbmFQcm9wZXJ0aWVzID0gYmFzZURpci5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICJjb25mL2NhdGFsaW5hLnByb3BlcnRpZXMiKS50b0ZpbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAJQ2F0YWxpbmFQcm9wZXJ0aWVzVXRpbC5hZGRHbG9iYWxDbGFzc3BhdGgoY2F0YWxpbmFQcm9wZXJ0aWVzLCBsb2FkZXIsCi0gICAgICAgICAgICAJCQluZXcgU3RyaW5nW10geyAiJHtjYXRhbGluYS5iYXNlfS8iICsgamFyTG9jICsgIi8qLmphciIgfSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDYXRhbGluYVByb3BzLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBDb250ZXh0cyB0byBzZXJ2ZSB3ZWIgcHJvamVjdHMgZGlyZWN0bHkuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgZGlyZWN0b3J5IHdoZXJlIHRoZSBDYXRhbGluYSBpbnN0YW5jZSBpcyBmb3VuZAotCSAqIEBwYXJhbSBsb2FkZXIgbmFtZSBvZiB0aGUgY2F0YWxpbmEucHJvcGVydGllcyBsb2FkZXIgdG8gdXNlIGZvciBnbG9iYWwKLQkgKiBjbGFzc3BhdGggZW50cmllcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIHVwZGF0ZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdXBkYXRlQ29udGV4dHNUb1NlcnZlRGlyZWN0bHkoSVBhdGggYmFzZURpciwgU3RyaW5nIGxvYWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJSVBhdGggY29uZkRpciA9IGJhc2VEaXIuYXBwZW5kKCJjb25mIik7Ci0JCUlQYXRoIHNlcnZlclhtbCA9IGNvbmZEaXIuYXBwZW5kKCJzZXJ2ZXIueG1sIik7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIDMwMCk7Ci0KLQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlTZXJ2ZXIgcHVibGlzaGVkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShzZXJ2ZXJYbWwudG9GaWxlKCkpKTsKLQkJCVNlcnZlckluc3RhbmNlIHB1Ymxpc2hlZEluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHB1Ymxpc2hlZFNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCS8vIGNhcmUgYWJvdXQgdG9wLWxldmVsIG1vZHVsZXMgb25seQotCQkJVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBUb21jYXRQdWJsaXNoTW9kdWxlVmlzaXRvcigKLQkJCQkJYmFzZURpciwgcHVibGlzaGVkSW5zdGFuY2UsIGxvYWRlcik7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gcHVibGlzaGVkSW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbW9kdWxlSWQgPSBjb250ZXh0c1tpXS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAobW9kdWxlSWQgIT0gbnVsbCAmJiBtb2R1bGVJZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShtb2R1bGVJZCk7Ci0JCQkJCU1vZHVsZVRyYXZlcnNlci50cmF2ZXJzZShtb2R1bGUsIHZpc2l0b3IsIG1vbml0b3IpOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShzZXJ2ZXJYbWwudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkNvbnRleHQgZG9jQmFzZSBzZXR0aW5ncyB1cGRhdGVkIGluIHNlcnZlci54bWwuIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbW9kaWZ5IGNvbnRleHQgY29uZmlndXJhdGlvbnMgdG8gc2VydmUgZGlyZWN0bHkgZm9yIFRvbWNhdCBjb25maWd1cmF0aW9uICIgKyBjb25mRGlyLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbnRleHRzIG91dCBvZiBjdXJyZW50IHB1Ymxpc2hlZCBzZXJ2ZXIueG1sIGFuZCBpbnRvIGluZGl2aWR1YWwKLQkgKiBjb250ZXh0IFhNTCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBkaXJlY3Rvcnkgd2hlcmUgdGhlIENhdGFsaW5hIGluc3RhbmNlIGlzIGZvdW5kCi0JICogQHBhcmFtIG5vUGF0aCB0cnVlIGlmIHBhdGggYXR0cmlidXRlIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGNvbnRleHQKLQkgKiBAcGFyYW0gc2VydmVyU3RvcHBlZCB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBtb3ZlQ29udGV4dHNUb1NlcGFyYXRlRmlsZXMoSVBhdGggYmFzZURpciwgYm9vbGVhbiBub1BhdGgsIGJvb2xlYW4gc2VydmVyU3RvcHBlZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQlJUGF0aCBzZXJ2ZXJYbWwgPSBjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpOwotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucHVibGlzaENvbmZpZ3VyYXRpb25UYXNrLCAzMDApOwotCi0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMucHVibGlzaENvbnRleHRDb25maWdUYXNrKTsKLQkJCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJU2VydmVyIHB1Ymxpc2hlZFNlcnZlciA9IChTZXJ2ZXIpIGZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyWG1sLnRvRmlsZSgpKSk7Ci0JCQlTZXJ2ZXJJbnN0YW5jZSBwdWJsaXNoZWRJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShwdWJsaXNoZWRTZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCi0JCQlIb3N0IGhvc3QgPSBwdWJsaXNoZWRJbnN0YW5jZS5nZXRIb3N0KCk7Ci0JCQlDb250ZXh0W10gd3RwQ29udGV4dHMgPSBwdWJsaXNoZWRJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKHd0cENvbnRleHRzICE9IG51bGwgJiYgd3RwQ29udGV4dHMubGVuZ3RoID4gMCkgewotCQkJCUlQYXRoIGNvbnRleHRQYXRoID0gcHVibGlzaGVkSW5zdGFuY2UuZ2V0Q29udGV4dFhtbERpcmVjdG9yeShzZXJ2ZXJYbWwucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLQkJCQlGaWxlIGNvbnRleHREaXIgPSBjb250ZXh0UGF0aC50b0ZpbGUoKTsKLQkJCQlpZiAoIWNvbnRleHREaXIuZXhpc3RzKCkpIHsKLQkJCQkJY29udGV4dERpci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJLy8gUHJvY2VzcyBpbiByZXZlcnNlIG9yZGVyLCBzaW5jZSBjb250ZXh0cyBtYXkgYmUgcmVtb3ZlZAotCQkJCWZvciAoaW50IGkgPSB3dHBDb250ZXh0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSB3dHBDb250ZXh0c1tpXTsKLQkJCQkJLy8gVE9ETyBIYW5kbGUgbm9uLXByb2plY3QgY29udGV4dHMgd2hlbiB0aGVpciByZW1vdmFsIGNhbiBiZSBhZGRyZXNzZWQKLQkJCQkJaWYgKGNvbnRleHQuZ2V0U291cmNlKCkgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJU3RyaW5nIG5hbWUgPSBjb250ZXh0LmdldFBhdGgoKTsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCX0KLQkJCQkJLy8gSWYgdGhlIGRlZmF1bHQgY29udGV4dCwgYWRqdXN0IHRoZSBmaWxlIG5hbWUKLQkJCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJbmFtZSA9ICJST09UIjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gVE9ETyBEZXRlcm1pbmUgY2lyY3Vtc3RhbmNlcywgaWYgYW55LCB3aGVyZSBzZXR0aW5nIGFudGlSZXNvdXJjZUxvY2tpbmcgdHJ1ZSBjYW4gY2F1c2UgdGhlIG9yaWdpbmFsIGRvY0Jhc2UgY29udGVudCB0byBiZSBkZWxldGVkLgotCQkJCQlpZiAoQm9vbGVhbi52YWx1ZU9mKGNvbnRleHQuZ2V0QXR0cmlidXRlVmFsdWUoImFudGlSZXNvdXJjZUxvY2tpbmciKSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZVZhbHVlKCJhbnRpUmVzb3VyY2VMb2NraW5nIiwgImZhbHNlIik7Ci0JCQkJCQotCQkJCQlGaWxlIGNvbnRleHRGaWxlID0gbmV3IEZpbGUoY29udGV4dERpciwgbmFtZSArICIueG1sIik7Ci0JCQkJCUNvbnRleHQgZXhpc3RpbmdDb250ZXh0ID0gbG9hZENvbnRleHRGaWxlKGNvbnRleHRGaWxlKTsKLQkJCQkJLy8gSWYgc2VydmVyIGlzIHN0b3BwZWQgb3IgaWYgY29udGV4dHMgYXJlIG5vdCB0aGUgZXF1aXZhbGVudCwgd3JpdGUgdGhlIGNvbnRleHQgZmlsZQotCQkJCQlpZiAoc2VydmVyU3RvcHBlZCB8fCAhY29udGV4dC5pc0VxdWl2YWxlbnQoZXhpc3RpbmdDb250ZXh0KSkgewotCQkJCQkJLy8gSWYgcmVxdWVzdGVkLCByZW1vdmUgcGF0aCBhdHRyaWJ1dGUKLQkJCQkJCWlmIChub1BhdGgpCi0JCQkJCQkJY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoInBhdGgiKTsKLQkJCQkJCQotCQkJCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpOwotCQkJCQkJRG9jdW1lbnQgY29udGV4dERvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQkJCQkJCWNvbnRleHREb2MuYXBwZW5kQ2hpbGQoY29udGV4dERvYy5pbXBvcnROb2RlKGNvbnRleHQuZ2V0RWxlbWVudE5vZGUoKSwgdHJ1ZSkpOwotCQkJCQkJWE1MVXRpbC5zYXZlKGNvbnRleHRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBjb250ZXh0RG9jKTsKLQkJCQkJfQotCi0JCQkJCWhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGkpOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCWlmIChtb2RpZmllZCkgewotCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5zYXZpbmdDb250ZXh0Q29uZmlnVGFzayk7Ci0JCQkJZmFjdG9yeS5zYXZlKHNlcnZlclhtbC50b09TU3RyaW5nKCkpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ29udGV4dCBkb2NCYXNlIHNldHRpbmdzIHVwZGF0ZWQgaW4gc2VydmVyLnhtbC4iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBtb2RpZnkgY29udGV4dCBjb25maWd1cmF0aW9ucyB0byBzZXJ2ZSBkaXJlY3RseSBmb3IgVG9tY2F0IGNvbmZpZ3VyYXRpb24gIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkU2VwYXJhdGVDb250ZXh0RmlsZXMoRmlsZSBjb250ZXh0RGlyLCBGYWN0b3J5IGZhY3RvcnksIE1hcCBwcm9qZWN0Q29udGV4dHMpIHsKLQkJRmlsZVtdIGNvbnRleHRGaWxlcyA9IGNvbnRleHREaXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLQkJCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIik7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgY29udGV4dEZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlGaWxlIGN0eCA9IGNvbnRleHRGaWxlc1tqXTsKLQotCQkJQ29udGV4dCBjb250ZXh0ID0gbG9hZENvbnRleHRGaWxlKGN0eCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8gVE9ETyBIYW5kbGUgbm9uLXByb2plY3QgY29udGV4dHMgd2hlbiB0aGVpciByZW1vdmFsIGNhbiBiZSBhZGRyZXNzZWQKLQkJCQlTdHJpbmcgbWVtZW50byA9IGNvbnRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG1lbWVudG8gIT0gbnVsbCkgewotCQkJCQlwcm9qZWN0Q29udGV4dHMucHV0KGN0eCwgY29udGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbnRleHQgbG9hZENvbnRleHRGaWxlKEZpbGUgY29udGV4dEZpbGUpIHsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JCWlmIChjb250ZXh0RmlsZSAhPSBudWxsICYmIGNvbnRleHRGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQkJZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbnRleHRGaWxlKTsKLQkJCQljb250ZXh0ID0gKENvbnRleHQpZmFjdG9yeS5sb2FkRG9jdW1lbnQoZmlzKTsKLQkJCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGV4dC5nZXRQYXRoKCk7Ci0JCQkJCS8vIElmIHBhdGggYXR0cmlidXRlIGlzIG5vdCBzZXQsIGRlcml2ZSBmcm9tIGZpbGUgbmFtZQotCQkJCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBjb250ZXh0RmlsZS5nZXROYW1lKCk7Ci0JCQkJCQlwYXRoID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gIi54bWwiLmxlbmd0aCgpKTsKLQkJCQkJCWlmICgiUk9PVCIuZXF1YWxzKHBhdGgpKQotCQkJCQkJCXBhdGggPSAiIjsKLQkJCQkJCWNvbnRleHQuc2V0UGF0aCgiLyIgKyBwYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5IGJlIGEgc3B1cmlvdXMgeG1sIGZpbGUgaW4gdGhlIGhvc3QgZGlyPwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiVW5hYmxlIHRvIHJlYWQgY29udGV4dCAiCi0JCQkJCQkrIGNvbnRleHRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDAwMmNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FUiA9IDQ7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV2ZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJDT05GSUcgICAiLCAiV0FSTklORyAgIiwgIlNFVkVSRSAgICIsICJGSU5FUiAgICAiLCAiRklORVNUICAgIn07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwYWNlciA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgcGx1Z2luTGVuZ3RoID0gLTE7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAoIVRvbWNhdFBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJLypTeXN0ZW0ub3V0LnByaW50bG4oVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsqLwotCQl0cmFjZShUb21jYXRQbHVnaW4uUExVR0lOX0lELCBsZXZlbCwgcywgdCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBwbHVnaW5JZCwgaW50IGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwgfHwgcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghVG9tY2F0UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luSWQubGVuZ3RoKCkgPiBwbHVnaW5MZW5ndGgpCi0JCQlwbHVnaW5MZW5ndGggPSBwbHVnaW5JZC5sZW5ndGgoKTsKLQkJZWxzZSBpZiAocGx1Z2luSWQubGVuZ3RoKCkgPCBwbHVnaW5MZW5ndGgpCi0JCQlzYi5hcHBlbmQoc3BhY2VyLnN1YnN0cmluZygwLCBwbHVnaW5MZW5ndGggLSBwbHVnaW5JZC5sZW5ndGgoKSkpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJLy9QbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihTZXJ2ZXJDb3JlLlBMVUdJTl9JRCArICIvIiArICJyZXNvdXJjZXMiKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHN0YXRlIG9mIGRlYnVnIGZsYWcgZm9yIHRoZSBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGlzIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVmVyaWZ5UmVzb3VyY2VTcGVjLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1ZlcmlmeVJlc291cmNlU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2YyMGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVmVyaWZ5UmVzb3VyY2VTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFZlcmlmeVJlc291cmNlU3BlYyB7Ci0JcHJpdmF0ZSBTdHJpbmcgc3BlYzsKLQlwcml2YXRlIFN0cmluZyBbXSBwYXRoczsKLQlwcml2YXRlIFN0cmluZyBvdGhlck5hbWVzOwotCXByaXZhdGUgaW50IGxhc3RTdWNjZXNzID0gLTE7Ci0JcHJpdmF0ZSBJU3RhdHVzIGVycm9yU3RhdHVzOwotCQotCXB1YmxpYyBWZXJpZnlSZXNvdXJjZVNwZWMoU3RyaW5nIHNwZWMpIHsKLQkJdGhpcy5zcGVjID0gc3BlYzsKLQkJaW50IGFsdEluZGV4ID0gc3BlYy5pbmRleE9mKCd8Jyk7Ci0JCWlmIChhbHRJbmRleCA8IDApIHsKLQkJCXBhdGhzID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhdGhzWzBdID0gc3BlYy50cmltKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZmlsZTEgPSBzcGVjLnN1YnN0cmluZygwLCBhbHRJbmRleCkudHJpbSgpOwotCQkJU3RyaW5nIGFsdFNwZWMgPSBzcGVjLnN1YnN0cmluZyhhbHRJbmRleCArIDEpOwotCQkJaWYgKGFsdFNwZWMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gZmlsZTEubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCQlTdHJpbmcgZGlyID0gaW5kZXggPj0gMCA/IGZpbGUxLnN1YnN0cmluZygwLCBpbmRleCArIDEpIDogIiI7Ci0JCQkJU3RyaW5nIFtdIGFsdE5hbWVzID0gYWx0U3BlYy5zcGxpdCgiXFx8Iik7Ci0JCQkJcGF0aHMgPSBuZXcgU3RyaW5nW2FsdE5hbWVzLmxlbmd0aCArIDFdOwotCQkJCXBhdGhzWzBdID0gZmlsZTE7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlwYXRoc1tpICsgMV0gPSBkaXIgKyBhbHROYW1lc1tpXS50cmltKCk7Ci0JCQkJfQotCQkJCW90aGVyTmFtZXMgPSBhbHRTcGVjLnJlcGxhY2UoJ3wnLCAnLCcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGF0aHMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhdGhzWzBdID0gZmlsZTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBbXSBnZXRQYXRocygpIHsKLQkJcmV0dXJuIHBhdGhzOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja1Jlc291cmNlKFN0cmluZyBpbnN0YWxsRGlyKSB7Ci0JCWlmIChsYXN0U3VjY2VzcyA+PSAwICkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5zdGFsbERpciwgcGF0aHNbbGFzdFN1Y2Nlc3NdKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IGxhc3RTdWNjZXNzKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5zdGFsbERpciwgcGF0aHNbaV0pOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWxhc3RTdWNjZXNzID0gaTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFJlc291cmNlIHdhcyBub3QgZm91bmQsIHJldHVybiBlcnJvciBzdGF0dXMKLQkJaWYgKGVycm9yU3RhdHVzID09IG51bGwpIHsKLQkJCS8vIENvbnN0cnVjdCBlcnJvciBzdGF0dXMgb24gZmlyc3QgdXNlCi0JCQlpZiAocGF0aHMubGVuZ3RoID09IDEgfHwgb3RoZXJOYW1lcyA9PSBudWxsKSB7Ci0JCQkJZXJyb3JTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpck1pc3NpbmdGaWxlLCBwYXRoc1swXSksIG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAocGF0aHMubGVuZ3RoID09IDIpIHsKLQkJCQllcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUyLCBwYXRoc1swXSwgIG90aGVyTmFtZXMpLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZTMsIHBhdGhzWzBdLCAgb3RoZXJOYW1lcyksIG51bGwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvclN0YXR1czsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHNwZWM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9XZWJBcHBEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9XZWJBcHBEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FlYTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViQXBwRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gYWNjZXNzIGEgd2ViLnhtbCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwRG9jdW1lbnQgewotCXByb3RlY3RlZCBib29sZWFuIGlzV2ViQXBwRGlydHk7Ci0JcHJvdGVjdGVkIERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JLyoqCi0JICogTG9hZHMgYSB3ZWIueG1sIGZyb20gdGhlIGdpdmVuIFVSTC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgV2ViQXBwRG9jdW1lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXdlYkFwcERvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKSkpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgd2ViLnhtbCBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgV2ViQXBwRG9jdW1lbnQoSUZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXdlYkFwcERvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoZmlsZS5nZXRDb250ZW50cygpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIE1pbWVNYXBwaW5nLgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBtYXAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuSU1pbWVNYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQWRkaW5nIG1pbWUgbWFwcGluZyAiICsgaW5kZXggKyAiICIgKyBtYXAuZ2V0TWltZVR5cGUoKSArICIgIiArIG1hcC5nZXRFeHRlbnNpb24oKSk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IHdlYkFwcERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlFbGVtZW50IG1hcHBpbmcgPSBYTUxVdGlsLmNyZWF0ZUNoaWxkRWxlbWVudCh3ZWJBcHBEb2N1bWVudCwgZWxlbWVudCwgaW5kZXgsICJtaW1lLW1hcHBpbmciKTsKLQkJWE1MVXRpbC5pbnNlcnRUZXh0KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAiXG5cdCIpOwotCQlYTUxVdGlsLmNyZWF0ZVRleHRDaGlsZEVsZW1lbnQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJleHRlbnNpb24iLCBtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlYTUxVdGlsLmluc2VydFRleHQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJcblx0Iik7Ci0JCVhNTFV0aWwuY3JlYXRlVGV4dENoaWxkRWxlbWVudCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgIm1pbWUtdHlwZSIsIG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJWE1MVXRpbC5pbnNlcnRUZXh0KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAiXG4iKTsKLQkJCi0JCWlzV2ViQXBwRGlydHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIE1pbWVNYXBwaW5ncy4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCUxpc3QgbWFwID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJRWxlbWVudCByb290ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gWE1MVXRpbC5nZXROb2RlSXRlcmF0b3Iocm9vdCwgIm1pbWUtbWFwcGluZyIpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIG1pbWVUeXBlID0gWE1MVXRpbC5nZXRTdWJOb2RlVmFsdWUoZWxlbWVudCwgIm1pbWUtdHlwZSIpOwotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IFhNTFV0aWwuZ2V0U3ViTm9kZVZhbHVlKGVsZW1lbnQsICJleHRlbnNpb24iKTsKLQkJCU1pbWVNYXBwaW5nIG1tID0gbmV3IE1pbWVNYXBwaW5nKGV4dGVuc2lvbiwgbWltZVR5cGUpOwotCQkJbWFwLmFkZChtbSk7Ci0JCX0KLQkJCi0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZpZXMgYSBtaW1lIG1hcHBpbmcuCi0JICoKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IHdlYkFwcERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWltZS1tYXBwaW5nIik7Ci0JCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudCkgbGlzdC5pdGVtKGluZGV4KTsKLQkJWE1MVXRpbC5zZXROb2RlVmFsdWUoZWxlbWVudDIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImV4dGVuc2lvbiIpLml0ZW0oMCksICJleHRlbnNpb24iLCBtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlYTUxVdGlsLnNldE5vZGVWYWx1ZShlbGVtZW50Mi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWltZS10eXBlIikuaXRlbSgwKSwgIm1pbWUtdHlwZSIsIG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJCi0JCWlzV2ViQXBwRGlydHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG1pbWUgbWFwcGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSB3ZWJBcHBEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1pbWUtbWFwcGluZyIpOwotCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaW5kZXgpOwotCQllbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgV2ViIGFwcCBkb2N1bWVudC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IHRydWUgdG8gZm9yY2UgYSBzYXZlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShTdHJpbmcgcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZm9yY2VEaXJ0eSB8fCBpc1dlYkFwcERpcnR5KQotCQkJWE1MVXRpbC5zYXZlKHBhdGgsIHdlYkFwcERvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgV2ViIGFwcCBkb2N1bWVudC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcgCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhaXNXZWJBcHBEaXJ0eSkKLQkJCXJldHVybjsKLQkJCi0JCWJ5dGVbXSBkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyh3ZWJBcHBEb2N1bWVudCk7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCWlzV2ViQXBwRGlydHkgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1dlYk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9XZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNzE2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1dlYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotLyoqCi0gKiBBIFdlYiBtb2R1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGUgaW1wbGVtZW50cyBJVG9tY2F0V2ViTW9kdWxlIHsKLQlwcml2YXRlIFN0cmluZyBkb2NCYXNlOwotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gcmVsb2FkYWJsZTsKLQotCS8qKgotCSAqIFdlYk1vZHVsZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBkb2NCYXNlIGEgZG9jdW1lbnQgYmFzZQotCSAqIEBwYXJhbSBtZW1lbnRvIGEgbWVtZW50bwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlbG9hZGFibGUKLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIG1lbWVudG8sIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLmRvY0Jhc2UgPSBkb2NCYXNlOwotCQl0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwotCQl0aGlzLnJlbG9hZGFibGUgPSByZWxvYWRhYmxlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZG9jdW1lbnQgYmFzZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlKCkgewotCQlyZXR1cm4gZG9jQmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGguIChjb250ZXh0IHJvb3QpCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVtZW50by4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50bygpIHsKLQkJcmV0dXJuIG1lbWVudG87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHdlYiBtb2R1bGUgaXMgYXV0by1yZWxvYWRhYmxlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWxvYWRhYmxlKCkgewotCQlyZXR1cm4gcmVsb2FkYWJsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBXZWJNb2R1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJV2ViTW9kdWxlIHdtID0gKFdlYk1vZHVsZSkgb2JqOwotCQlpZiAoIWdldERvY3VtZW50QmFzZSgpLmVxdWFscyh3bS5nZXREb2N1bWVudEJhc2UoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0UGF0aCgpLmVxdWFscyh3bS5nZXRQYXRoKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWdldE1lbWVudG8oKS5lcXVhbHMod20uZ2V0TWVtZW50bygpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNaW1lTWFwcGluZ0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxMzkxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkTWltZU1hcHBpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCBhIG1pbWUgbWFwcGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFkZE1pbWVNYXBwaW5nQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgTWltZU1hcHBpbmcgbWFwOwotCi0JLyoqCi0JICogQWRkTWltZU1hcHBpbmdDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgdG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbWFwIGEgbWltZSBtYXBwaW5nCi0JICovCi0JcHVibGljIEFkZE1pbWVNYXBwaW5nQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIE1pbWVNYXBwaW5nIG1hcCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkTWltZU1hcHBpbmcpOwotCQl0aGlzLm1hcCA9IG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWNvbmZpZ3VyYXRpb24uYWRkTWltZU1hcHBpbmcoMCwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ucmVtb3ZlTWltZU1hcHBpbmcoMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1vZHVsZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNb2R1bGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTM1MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGEgd2ViIG1vZHVsZSB0byBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIEFkZE1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBpbnQgbW9kdWxlcyA9IC0xOwotCi0JLyoqCi0JICogQWRkTW9kdWxlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqLwotCXB1YmxpYyBBZGRNb2R1bGVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGUpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIubW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc2VydmVyLm1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRXZWJNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkV2ViTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE4MjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRXZWJNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLS8qKgotICogQ29tbWFuZCB0byBhZGQgYSB3ZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgQWRkV2ViTW9kdWxlQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgV2ViTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgaW50IG1vZHVsZXMgPSAtMTsKLQotCS8qKgotCSAqIEFkZFdlYk1vZHVsZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG1vZHVsZSBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgQWRkV2ViTW9kdWxlQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZFdlYk1vZHVsZSk7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbW9kdWxlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLnNpemUoKTsKLQkJY29uZmlndXJhdGlvbi5hZGRXZWJNb2R1bGUoLTEsIG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLnJlbW92ZVdlYk1vZHVsZShtb2R1bGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNjMTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotLyoqCi0gKiBDb25maWd1cmF0aW9uIGNvbW1hbmQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvbkNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIFRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxhYmVsIGEgbGFiZWwKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmRvKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFhMTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NaW1lTWFwcGluZzsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgYSBtaW1lIHR5cGUgZXh0ZW5zaW9uLgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG9sZE1hcDsKLQlwcm90ZWN0ZWQgTWltZU1hcHBpbmcgbmV3TWFwOwotCi0JLyoqCi0JICogQSBjb21tYW5kIHRvIG1vZGlmeSBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4IGFuIGluZGV4Ci0JICogQHBhcmFtIG1hcCBhIG1pbWUgbWFwcGluZwotCSAqLwotCXB1YmxpYyBNb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBpbnQgaW5kZXgsIE1pbWVNYXBwaW5nIG1hcCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5TWltZU1hcHBpbmcpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCW5ld01hcCA9IG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZE1hcCA9IChNaW1lTWFwcGluZykgY29uZmlndXJhdGlvbi5nZXRNaW1lTWFwcGluZ3MoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBuZXdNYXApOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgb2xkTWFwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVBvcnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlZDEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlQb3J0Q29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBpbnQgcG9ydDsKLQlwcm90ZWN0ZWQgaW50IG9sZFBvcnQ7Ci0KLQkvKioKLQkgKiBNb2RpZnlQb3J0Q29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIFRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGlkIGEgcG9ydCBpZAotCSAqIEBwYXJhbSBwb3J0IG5ldyBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBNb2RpZnlQb3J0Q29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVBvcnQpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIG9sZCBwb3J0IG51bWJlcgotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHRlbXAgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyh0ZW1wLmdldElkKCkpKQotCQkJCW9sZFBvcnQgPSB0ZW1wLmdldFBvcnQoKTsKLQkJfQotCQotCQkvLyBtYWtlIHRoZSBjaGFuZ2UKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlTZXJ2ZXJQb3J0KGlkLCBwb3J0KTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5U2VydmVyUG9ydChpZCwgb2xkUG9ydCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlXZWJNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWMzZmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlXZWJNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSBhIHdlYiBtb2R1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlXZWJNb2R1bGVDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBvbGRNb2R1bGU7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBuZXdNb2R1bGU7Ci0KLQlwdWJsaWMgTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCwgV2ViTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5V2ViTW9kdWxlKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQluZXdNb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRNb2R1bGUgPSAoV2ViTW9kdWxlKSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLm1vZGlmeVdlYk1vZHVsZShpbmRleCwgbmV3TW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBuZXdNb2R1bGUuZ2V0UGF0aCgpLCBuZXdNb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlXZWJNb2R1bGUoaW5kZXgsIG9sZE1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgb2xkTW9kdWxlLmdldFBhdGgoKSwgb2xkTW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMyNzU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NaW1lTWFwcGluZzsKLS8qKgotICogQ29tbWFuZCB0byByZW1vdmUgYSBtaW1lIG1hcHBpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBpbmRleDsKLQlwcm90ZWN0ZWQgTWltZU1hcHBpbmcgbWFwcGluZzsKLQotCS8qKgotCSAqIFJlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4IGFuIGluZGV4Ci0JICovCi0JcHVibGljIFJlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlTWltZU1hcHBpbmcpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBjb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpLmdldChpbmRleCk7Ci0JCWNvbmZpZ3VyYXRpb24ucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwcGluZyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjM1OTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBDb21tYW5kIHRvIHJlbW92ZSBhIHdlYiBtb2R1bGUgZnJvbSBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCi0JLyoqCi0JICogQWRkTW9kdWxlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqLwotCXB1YmxpYyBSZW1vdmVNb2R1bGVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVXZWJNb2R1bGUpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIubW9kaWZ5TW9kdWxlcyhudWxsLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc2VydmVyLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVXZWJNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ5ZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVXZWJNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlOwotLyoqCi0gKiBDb21tYW5kIHRvIHJlbW92ZSBhIHdlYiBtb2R1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVXZWJNb2R1bGVDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBSZW1vdmVXZWJNb2R1bGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleCBhbiBpbmRleAotCSAqLwotCXB1YmxpYyBSZW1vdmVXZWJNb2R1bGVDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVXZWJNb2R1bGUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb2R1bGUgPSAoV2ViTW9kdWxlKSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLnJlbW92ZVdlYk1vZHVsZShpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZThhZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwotLyoqCi0gKiBBIGNvbW1hbmQgb24gYSBUb21jYXQgc2VydmVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0U2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIFNlcnZlckNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5zZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXI7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmRvKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldERlYnVnTW9kZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZWJ1Z01vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjU2YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldERlYnVnTW9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBkZWJ1ZyBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgU2V0RGVidWdNb2RlQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCXByb3RlY3RlZCBib29sZWFuIG9sZERlYnVnOwotCi0JLyoqCi0JICogU2V0RGVidWdNb2RlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIGRlYnVnIDxjb2RlPnRydWU8L2NvZGU+IGZvciBkZWJ1ZyBtb2RlCi0JICovCi0JcHVibGljIFNldERlYnVnTW9kZUNvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgYm9vbGVhbiBkZWJ1ZykgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvckFjdGlvblNldERlYnVnTW9kZSk7Ci0JCXRoaXMuZGVidWcgPSBkZWJ1ZzsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZERlYnVnID0gc2VydmVyLmlzRGVidWcoKTsKLQkJc2VydmVyLnNldERlYnVnKGRlYnVnKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXREZWJ1ZyhvbGREZWJ1Zyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZXBsb3lEaXJlY3RvcnlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDEwZTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZXBsb3lEaXJlY3RvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFNBUyBJbnN0aXR1dGUsIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBMYXJyeSBJc2FhY3MgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotCi0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBkZXBsb3kgZGlyZWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXREZXBsb3lEaXJlY3RvcnlDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZXBsb3lEaXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGREZXBsb3lEaXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGNvbW1hbmQgdG8gc2V0IHRoZSBkZXBsb3kgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveURpciBkZXBsb3ltZW50IGRpcmVjdG9yeSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLAotCQkJU3RyaW5nIGRlcGxveURpcikgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvckFjdGlvblNldERlcGxveURpcmVjdG9yeSk7Ci0JCXRoaXMuZGVwbG95RGlyID0gZGVwbG95RGlyOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgc2V0dGluZyB0aGUgZGVwbG95IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZERlcGxveURpciA9IHNlcnZlci5nZXREZXBsb3lEaXJlY3RvcnkoKTsKLQkJc2VydmVyLnNldERlcGxveURpcmVjdG9yeShkZXBsb3lEaXIpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgcHJpb3IgZGVwbG95IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXREZXBsb3lEaXJlY3Rvcnkob2xkRGVwbG95RGlyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0SW5zdGFuY2VEaXJlY3RvcnlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0SW5zdGFuY2VEaXJlY3RvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTQ2MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgZGVwbG95IGRpcmVjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgU2V0SW5zdGFuY2VEaXJlY3RvcnlDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpbnN0YW5jZURpcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZEluc3RhbmNlRGlyOwotCXByb3RlY3RlZCBib29sZWFuIG9sZFRlc3RFbnZpcm9ubWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgY29tbWFuZCB0byBzZXQgdGhlIGluc3RhbmNlIGRpcmVjdG9yeS4gU2V0dGluZwotCSAqIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkgYWxzbyBzZXRzIHRlc3RFbnZpcm9ubWVudCB0cnVlOwotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIGluc3RhbmNlRGlyIGluc3RhbmNlIGRpcmVjdG9yeSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgU2V0SW5zdGFuY2VEaXJlY3RvcnlDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBpbnN0YW5jZURpcikgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvckFjdGlvblNldFNlcnZlckRpcmVjdG9yeSk7Ci0JCXRoaXMuaW5zdGFuY2VEaXIgPSBpbnN0YW5jZURpcjsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHNldHRpbmcgdGhlIGRlcGxveSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRUZXN0RW52aXJvbm1lbnQgPSBzZXJ2ZXIuaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkJb2xkSW5zdGFuY2VEaXIgPSBzZXJ2ZXIuZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKTsKLQkJaWYgKCFvbGRUZXN0RW52aXJvbm1lbnQpCi0JCQlzZXJ2ZXIuc2V0VGVzdEVudmlyb25tZW50KHRydWUpOwotCQlzZXJ2ZXIuc2V0SW5zdGFuY2VEaXJlY3RvcnkoaW5zdGFuY2VEaXIpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgcHJpb3IgZGVwbG95IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghb2xkVGVzdEVudmlyb25tZW50KQotCQkJc2VydmVyLnNldFRlc3RFbnZpcm9ubWVudChmYWxzZSk7Ci0JCXNlcnZlci5zZXRJbnN0YW5jZURpcmVjdG9yeShvbGRJbnN0YW5jZURpcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjdhMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBlbmFibGUgb3IgZGlzYWJsZSBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dCBwdWJsaXNoaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3NjZjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRTc2NmOwotCi0JLyoqCi0JICogU2V0U2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gc3NjZiA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgc2F2aW5nIHNlcGFyYXRlIGNvbnRleHQgWE1MCi0JICogZmlsZXMuIE90aGVyd2lzZSBjb250ZXh0cyBhcmUga2VwdCBpbiBzZXJ2ZXIueG1sIHdoZW4gcHVibGlzaGVkLgotCSAqLwotCXB1YmxpYyBTZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGJvb2xlYW4gc3NjZikgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVpZHRvckFjdGlvblNldFNlcGFyYXRlQ29udGV4dEZpbGVzKTsKLQkJdGhpcy5zc2NmID0gc3NjZjsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFNzY2YgPSBzZXJ2ZXIuaXNTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoKTsKLQkJc2VydmVyLnNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcyhzc2NmKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMob2xkU3NjZik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTZWN1cmVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VjdXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU0MjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTZWN1cmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgc2VjdXJpdHkgb3B0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VjdXJlQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIHNlY3VyZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRTZWN1cmU7Ci0KLQkvKioKLQkgKiBTZXRTZWN1cmVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VjdXJlIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzZWN1cml0eSBvbgotCSAqLwotCXB1YmxpYyBTZXRTZWN1cmVDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGJvb2xlYW4gc2VjdXJlKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VjdXJlKTsKLQkJdGhpcy5zZWN1cmUgPSBzZWN1cmU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTZWN1cmUgPSBzZXJ2ZXIuaXNTZWN1cmUoKTsKLQkJc2VydmVyLnNldFNlY3VyZShzZWN1cmUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFNlY3VyZShvbGRTZWN1cmUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2hDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTBlMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGVuYWJsZSBvciBkaXNhYmxlIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcKLSAqLwotcHVibGljIGNsYXNzIFNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIHNtd3A7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkU213cDsKLQotCS8qKgotCSAqIFNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIHNtd3AgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0Ci0JICogcHVibGlzaGluZy4gT3RoZXJ3aXNlIG1vZHVsZXMgYXJlIHNlcnZlZCB3aXRoIHN0YW5kYXJkIHB1Ymxpc2hpbmcuCi0JICovCi0JcHVibGljIFNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBib29sZWFuIHNtd3ApIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZVdpdGhvdXRQdWJsaXNoKTsKLQkJdGhpcy5zbXdwID0gc213cDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFNtd3AgPSBzZXJ2ZXIuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpOwotCQlzZXJ2ZXIuc2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goc213cCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2gob2xkU213cCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVkMTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciB0ZXN0IG1vZGUuICBUaGUgc2VydmVyIGluc3RhbmNlIGRpcmVjdG9yeQotICogaXMgY2xlYXJlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoaXMgY29tbWFuZCBmb3IgbGVnYWN5IHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkVGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRJbnN0YW5jZURpcjsKLQotCS8qKgotCSAqIFNldFRlc3RFbnZpcm9ubWVudENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSB0ZSA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYSB0ZXN0IGVudmlyb25tZW50LgotCSAqLwotCXB1YmxpYyBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGJvb2xlYW4gdGUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZXJEaXJlY3RvcnkpOwotCQl0aGlzLnRlID0gdGU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRUZSA9IHNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpOwotCQkvLyBzYXZlIG9sZCBpbnN0YW5jZSBkaXJlY3RvcnkKLQkJb2xkSW5zdGFuY2VEaXIgPSBzZXJ2ZXIuZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKTsKLQkJc2VydmVyLnNldFRlc3RFbnZpcm9ubWVudCh0ZSk7Ci0JCS8vIGVuc3VyZSBpbnN0YW5jZSBkaXJlY3RvcnkgaXMgY2xlYXJlZAotCQlzZXJ2ZXIuc2V0SW5zdGFuY2VEaXJlY3RvcnkobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0VGVzdEVudmlyb25tZW50KG9sZFRlKTsKLQkJc2VydmVyLnNldEluc3RhbmNlRGlyZWN0b3J5KG9sZEluc3RhbmNlRGlyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRXZWJNb2R1bGVQYXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBmMWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRXZWJNb2R1bGVQYXRoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLS8qKgotICogQ29tbWFuZCB0byBtb2RpZnkgdGhlIHBhdGggb2YgYSBXZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBpbmRleDsKLQlwcm90ZWN0ZWQgV2ViTW9kdWxlIG9sZE1vZHVsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBTZXRXZWJNb2R1bGVQYXRoQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgdG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXgKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QgdGhlIGNvbnRleHQgcm9vdAotCSAqLwotCXB1YmxpYyBTZXRXZWJNb2R1bGVQYXRoQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25FZGl0V2ViTW9kdWxlUGF0aCk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5wYXRoID0gY29udGV4dFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRNb2R1bGUgPSAoV2ViTW9kdWxlKSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLnJlbW92ZVdlYk1vZHVsZShpbmRleCk7Ci0JCQotCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLCBvbGRNb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCksIG9sZE1vZHVsZS5nZXRNZW1lbnRvKCksIG9sZE1vZHVsZS5pc1JlbG9hZGFibGUoKSk7Ci0JCWNvbmZpZ3VyYXRpb24uYWRkV2ViTW9kdWxlKGluZGV4LCBtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgb2xkTW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC93c3QvSU1vZHVsZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvd3N0L0lNb2R1bGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODY4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC93c3QvSU1vZHVsZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJZ29yIEZlZG9yZW5rbyAmIEZhYnJpemlvIEdpdXN0aW5hIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC53c3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBWaXNpdG9yIGludGVyZmFjZSB0byBwcm9jZXNzIG1vZHVsZSBjb21wb25lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVZpc2l0b3IgewotCi0JLyoqCi0JICogUHJvY2VzcyB3ZWIgY29tcG9uZW50Ci0JICogQHBhcmFtIGNvbXBvbmVudCB3ZWIgY29tcG9uZW50IHRvIHByb2Nlc3MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHZpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQb3N0IHByb2Nlc3Mgd2ViIGNvbXBvbmVudAotCSAqIEBwYXJhbSBjb21wb25lbnQgd2ViIGNvbXBvbmVudCB0byBwcm9jZXNzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCBlbmRWaXNpdFdlYkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJvY2VzcyBhcmNoaXZlIGNvbXBvbmVudC4KLQkgKiBAcGFyYW0gcnVudGltZVBhdGggcGF0aCBmb3IgY29tcG9uZW50IGF0IHJ1bnRpbWUKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCBwYXRoIHRvIGNvbXBvbmVudCBpbiB3b3Jrc3BhY2UKLQkgKi8KLQl2b2lkIHZpc2l0QXJjaGl2ZUNvbXBvbmVudChJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCk7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGRlcGVuZGVudCBjb21wb25lbnQuCi0JICogQHBhcmFtIHJ1bnRpbWVQYXRoIHBhdGggZm9yIGNvbXBvbmVudCBhdCBydW50aW1lCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggcGF0aCB0byBjb21wb25lbnQgaW4gd29ya3NwYWNlCi0JICovCi0Jdm9pZCB2aXNpdERlcGVuZGVudENvbXBvbmVudChJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCk7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHdlYiByZXNvdXJjZS4KLQkgKiBAcGFyYW0gcnVudGltZVBhdGggcGF0aCBmb3IgcmVzb3VyY2UgYXQgcnVudGltZQotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoIHBhdGggdG8gcmVzb3VyY2UgaW4gd29ya3NwYWNlCi0JICovCi0Jdm9pZCB2aXNpdFdlYlJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKTsKLQotCS8qKgotCSAqIFByb2Nlc3MgRUFSIHJlc291cmNlLgotCSAqIEBwYXJhbSBydW50aW1lUGF0aCBwYXRoIGZvciByZXNvdXJjZSBhdCBydW50aW1lCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggcGF0aCB0byByZXNvdXJjZSBpbiB3b3Jrc3BhY2UKLQkgKi8KLQl2b2lkIHZpc2l0RWFyUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpOwotCi0JLyoqCi0JICogUG9zdCBwcm9jZXNzIEVBUiByZXNvdXJjZS4KLQkgKiBAcGFyYW0gY29tcG9uZW50IEVBUiBjb21wb25lbnQgdG8gcHJvY2VzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQl2b2lkIGVuZFZpc2l0RWFyQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3dzdC9Nb2R1bGVUcmF2ZXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvd3N0L01vZHVsZVRyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM0NWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvd3N0L01vZHVsZVRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJZ29yIEZlZG9yZW5rbyAmIEZhYnJpemlvIEdpdXN0aW5hIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC53c3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLQotLyoqCi0gKiBUZW1wb3Jhcnkgc29sdXRpb24gZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM4ODgKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBGYWNldCB0eXBlIGZvciBFQVIgbW9kdWxlcwotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9NT0RVTEUgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFOwotCi0gICAgLyoqCi0gICAgICogRmFjZXQgdHlwZSBmb3IgV2ViIG1vZHVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsKLQotICAgIC8qKgotICAgICAqIEZhY2V0IHR5cGUgZm9yIHV0aWxpdHkgbW9kdWxlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVUSUxJVFlfTU9EVUxFID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEU7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBjdXN0b20gSmF2YSBjbGFzc3BhdGggZW50cnkgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCB0byBmbGFnIGVudHJpZXMKLSAgICAgKiB3aGljaCBzaG91bGQgYmUgZXhwb3NlZCBhcyBtb2R1bGUgZGVwZW5kZW5jaWVzIHZpYSB0aGUgdmlydHVhbCBjb21wb25lbnQgQVBJLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSA9ICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEKLSAgICAKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBjdXN0b20gSmF2YSBjbGFzc3BhdGggZW50cnkgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCB0byBmbGFnCi0JICogdGhlIHJlc29sdmVkIGVudHJpZXMgb2YgY2xhc3NwYXRoIGNvbnRhaW5lcnMgdGhhdCBzaG91bGQgbm90IGJlIGV4cG9zZWQKLQkgKiB2aWEgdGhlIHZpcnR1YWwgY29tcG9uZW50IEFQSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQ09NUE9ORU5UX05PTl9ERVBFTkRFTkNZID0gIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQubm9uZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMQotCi0JLyoqCi0gICAgICogU2NhbnMgdGhlIG1vZHVsZSB1c2luZyB0aGUgc3BlY2lmaWVkIHZpc2l0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZHVsZSBtb2R1bGUgdG8gdHJhdmVyc2UKLSAgICAgKiBAcGFyYW0gdmlzaXRvciB2aXNpdG9yIHRvIGhhbmRsZSByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhdmVyc2UoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQotICAgICAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhbiBoYXBwZW4gaWYgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQKLSAgICAgICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJVbmFibGUgdG8gY3JlYXRlIGNvbXBvbmVudCBmb3IgbW9kdWxlICIKLSAgICAgICAgICAgICAgICAgICAgKyBtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChFQVJfTU9EVUxFLmVxdWFscyh0eXBlSWQpKSB7Ci0gICAgICAgICAgICB0cmF2ZXJzZUVhckNvbXBvbmVudChjb21wb25lbnQsIHZpc2l0b3IsIG1vbml0b3IpOwotICAgICAgICB9IGVsc2UgaWYgKFdFQl9NT0RVTEUuZXF1YWxzKHR5cGVJZCkpIHsKLSAgICAgICAgICAgIHRyYXZlcnNlV2ViQ29tcG9uZW50KGNvbXBvbmVudCwgdmlzaXRvciwgbW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlRWFyQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJLy8gQ3VycmVudGx5IHRoZSBKU1QgU2VydmVyIHBvcnRpb24gb2YgV1RQIG1heSBub3QgZGVwZW5kIG9uIHRoZSBKU1QgRW50ZXJwcmlzZSBwb3J0aW9uIG9mIFdUUAotLyogICAgICAgIEVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0Ci0gICAgICAgICAgICAgICAgLmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLSAgICAgICAgaWYgKGVhckVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2VbXSBqMmVlQ29tcG9uZW50cyA9IGVhckVkaXQuZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajJlZUNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cmF2ZXJzZVdlYkNvbXBvbmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGoyZWVDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgdmlzaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2VbXSBqYXJDb21wb25lbnRzID0gZWFyRWRpdC5nZXRVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gamFyQ29tcG9uZW50c1tpXTsKLSAgICAgICAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBqYXJDb21wb25lbnQgPSBqYXJSZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgZGVwZW5kZW50UHJvamVjdCA9IGphckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRQcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShkZXBlbmRlbnRQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgY3BlID0gZ2V0Q2xhc3NwYXRoRW50cnkocHJvamVjdCwgamFyQ29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEVhclJlc291cmNlKG51bGwsIGdldE9TUGF0aChkZXBlbmRlbnRQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgY3BlLmdldE91dHB1dExvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSovCi0gICAgICAgIHZpc2l0b3IuZW5kVmlzaXRFYXJDb21wb25lbnQoY29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlV2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICB2aXNpdG9yLnZpc2l0V2ViQ29tcG9uZW50KGNvbXBvbmVudCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvaiA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgd2FyU3RydWN0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wID0gd2FyU3RydWN0LmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZXR0aW5nIFdvcmtiZW5jaENvbXBvbmVudCBmcm9tIHdhciBwcm9qZWN0LiBJUHJvamVjdD1cIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qICsgIlwiIFN0cnVjdHVyZUVkaXQ9XCIiICsgd2FyU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIFdvcmtiZW5jaENvbXBvbmVudD1cIiIgKyBjb21wICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhdmVyc2VXZWJDb21wb25lbnRMb2NhbEVudHJpZXMoY29tcCwgdmlzaXRvciwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIHRyYXZlcnNlIHJlZmVyZW5jZWQgY29tcG9uZW50cwotICAgICAgICAgICAgTGlzdCBjaGlsZHJlbiA9IGNvbXAuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFJlZmVyZW5jZWRDb21wb25lbnQgY2hpbGRSZWYgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVBhdGggcnRGb2xkZXIgPSBjaGlsZFJlZi5nZXRSdW50aW1lUGF0aCgpOwotICAgICAgICAgICAgICAgIFVSSSByZWZIYW5kbGUgPSBjaGlsZFJlZi5nZXRIYW5kbGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQ0xBU1NQQVRILmVxdWFscygKLSAgICAgICAgICAgICAgICAJCXJlZkhhbmRsZS5zZWdtZW50KE1vZHVsZVVSSVV0aWwuTW9kdWxlVVJJLlNVQl9QUk9UT0NPTF9JTkRYKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggcmVmUGF0aCA9IGdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQocmVmSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gYXJjaGl2ZSBjb21wb25lbnQsIGFkZCB0byBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmICghcmVmUGF0aC5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlZlBhdGgpOwotICAgICAgICAgICAgICAgICAgICAJCUlQYXRoIHJlZlBhdGgyID0gZmlsZS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAJCWlmIChyZWZQYXRoMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJCXZpc2l0b3IudmlzaXRBcmNoaXZlQ29tcG9uZW50KHJ0Rm9sZGVyLCByZWZQYXRoMik7Ci0gICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAJCWVsc2UgewotICAgICAgICAgICAgICAgICAgICAJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgCQkJCQkiQ291bGQgbm90IGdldCB0aGUgbG9jYXRpb24gb2YgYSByZWZlcmVuY2VkIGNvbXBvbmVudC4gIEl0IG1heSBub3QgZXhpc3QuICBQcm9qZWN0PXswfSwgUGFyZW50IENvbXBvbmVudD17MX0sIFJlZmVyZW5jZWQgQ29tcG9uZW50IFBhdGg9ezJ9IiwKLSAgICAgICAgICAgICAgICAgICAgCQkJCQluZXcgT2JqZWN0W10geyBwcm9qLmdldE5hbWUoKSwgY29tcC5nZXROYW1lKCksIHJlZlBhdGh9KSk7Ci0gICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJdmlzaXRvci52aXNpdEFyY2hpdmVDb21wb25lbnQocnRGb2xkZXIsIHJlZlBhdGgpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJLy8gVE9ETyBEZXRlcm1pbmUgaWYgYW55IHVzZSBjYXNlIHdvdWxkIGFycml2ZSBoZXJlLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjaGlsZENvbSA9IHdhclN0cnVjdC5maW5kQ29tcG9uZW50QnlVUkkocmVmSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlRGVwZW5kZW50RW50cmllcyh2aXNpdG9yLCBydEZvbGRlciwgY2hpbGRDb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvbWNhdFBsdWdpbi5sb2coZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3YXJTdHJ1Y3QuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlzaXRvci5lbmRWaXNpdFdlYkNvbXBvbmVudChjb21wb25lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJhdmVyc2VXZWJDb21wb25lbnRMb2NhbEVudHJpZXMoCi0gICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgY29tcCwgSU1vZHVsZVZpc2l0b3IgdmlzaXRvciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJUHJvamVjdCB3YXJQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChjb21wKTsKLSAgICAgICAgaWYgKHdhclByb2plY3QgPT0gbnVsbCB8fCAhd2FyUHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHdhclByb2plY3QpOwotCi0gICAgICAgIExpc3QgcmVzID0gY29tcC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdG9yUmVzID0gcmVzLml0ZXJhdG9yKCk7IGl0b3JSZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgY2hpbGRDb21wID0gKENvbXBvbmVudFJlc291cmNlKSBpdG9yUmVzLm5leHQoKTsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBnZXRDbGFzc3BhdGhFbnRyeShwcm9qZWN0LCBjaGlsZENvbXAuZ2V0U291cmNlUGF0aCgpKTsKLSAgICAgICAgICAgIGlmIChjcGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHZpc2l0b3IudmlzaXRXZWJSZXNvdXJjZShjaGlsZENvbXAuZ2V0UnVudGltZVBhdGgoKSwgZ2V0T1NQYXRoKAotICAgICAgICAgICAgICAgICAgICB3YXJQcm9qZWN0LCBwcm9qZWN0LCBjcGUuZ2V0T3V0cHV0TG9jYXRpb24oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jbHVkZSB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgICAgTWFwIGNsYXNzcGF0aERlcHMgPSBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMocHJvamVjdCwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjbGFzc3BhdGhEZXBzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpaXRlcmF0b3IubmV4dCgpOwotCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSljbGFzc3BhdGhEZXBzLmdldChlbnRyeSk7Ci0JCQlib29sZWFuIGlzQ2xhc3NGb2xkZXIgPSBpc0NsYXNzRm9sZGVyRW50cnkoZW50cnkpOwotCQkJU3RyaW5nIHJ0Rm9sZGVyID0gYXR0cmliLmdldFZhbHVlKCk7Ci0JCQlpZiAocnRGb2xkZXIgPT0gbnVsbCkgewotCQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJCXJ0Rm9sZGVyID0gIi9XRUItSU5GL2NsYXNzZXMiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ0Rm9sZGVyID0gIi9XRUItSU5GL2xpYiI7Ci0JCQkJfQotCQkJfSAKLQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCUlSZXNvdXJjZSBlbnRyeVJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCQkJaWYgKGVudHJ5UmVzICE9IG51bGwpIHsKLQkJCQllbnRyeVBhdGggPSBlbnRyeVJlcy5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gVE9ETyBEZXRlcm1pbmUgaWYgZGlmZmVyZW50IGhhbmRsaW5nIGlzIG5lZWRlZCBmb3Igc29tZSB1c2UgY2FzZXMKLQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJIHZpc2l0b3IudmlzaXRXZWJSZXNvdXJjZShuZXcgUGF0aChydEZvbGRlciksIAotCQkgICAgICAgICAgICAgICAgICAgIGdldE9TUGF0aCh3YXJQcm9qZWN0LCBwcm9qZWN0LCBlbnRyeS5nZXRQYXRoKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlzaXRvci52aXNpdEFyY2hpdmVDb21wb25lbnQobmV3IFBhdGgocnRGb2xkZXIpLCBlbnRyeVBhdGgpOwkJCQkKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJhdmVyc2VEZXBlbmRlbnRFbnRyaWVzKElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsCi0gICAgICAgICAgICBJUGF0aCBydW50aW1lRm9sZGVyLCBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IGRlcGVuZGVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGNvbXBvbmVudCk7Ci0gICAgICAgIGlmICghZGVwZW5kZW50UHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZGVwZW5kZW50UHJvamVjdCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOyAvLyBhc3N1bWUgaXQgaXMgdGhlIHNhbWUgYXMgVVJJCi0KLSAgICAgICAgLy8gZ28gdGhydSBhbGwgZW50cmllcwotICAgICAgICBMaXN0IHJlcyA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdG9yUmVzID0gcmVzLml0ZXJhdG9yKCk7IGl0b3JSZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgY2hpbGRDb21wID0gKENvbXBvbmVudFJlc291cmNlKSBpdG9yUmVzLm5leHQoKTsKLSAgICAgICAgICAgIElQYXRoIHJ0UGF0aCA9IGNoaWxkQ29tcC5nZXRSdW50aW1lUGF0aCgpOwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGdldENsYXNzcGF0aEVudHJ5KHByb2plY3QsIGNoaWxkQ29tcC5nZXRTb3VyY2VQYXRoKCkpOwotICAgICAgICAgICAgaWYgKGNwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgdmlzaXRvci52aXNpdERlcGVuZGVudENvbXBvbmVudChydW50aW1lRm9sZGVyLmFwcGVuZChydFBhdGgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSArICIuamFyIiksIGdldE9TUGF0aChkZXBlbmRlbnRQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LCBjcGUuZ2V0T3V0cHV0TG9jYXRpb24oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jbHVkZSB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgICAgTWFwIGNsYXNzcGF0aERlcHMgPSBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMocHJvamVjdCwgZmFsc2UpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3NwYXRoRGVwcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNDbGFzc0ZvbGRlciA9IGlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCQlTdHJpbmcgcnRGb2xkZXIgPSBudWxsOwotCQkJaWYgKGlzQ2xhc3NGb2xkZXIpIHsKLQkJCQlydEZvbGRlciA9ICIvIjsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRGb2xkZXIgPSAiL1dFQi1JTkYvbGliIjsKLQkJCX0KLQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCUlSZXNvdXJjZSBlbnRyeVJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCQkJaWYgKGVudHJ5UmVzICE9IG51bGwpIHsKLQkJCQllbnRyeVBhdGggPSBlbnRyeVJlcy5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gVE9ETyBEZXRlcm1pbmUgaWYgZGlmZmVyZW50IGhhbmRsaW5nIGlzIG5lZWRlZCBmb3Igc29tZSB1c2UgY2FzZXMKLQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJIHZpc2l0b3IudmlzaXREZXBlbmRlbnRDb21wb25lbnQocnVudGltZUZvbGRlci5hcHBlbmQocnRGb2xkZXIpCi0JCSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuYW1lICsgIi5qYXIiKSwgZ2V0T1NQYXRoKGRlcGVuZGVudFByb2plY3QsCi0JCSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgZW50cnkuZ2V0UGF0aCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXZpc2l0b3IudmlzaXRBcmNoaXZlQ29tcG9uZW50KG5ldyBQYXRoKHJ0Rm9sZGVyKSwgZW50cnlQYXRoKTsKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIElQYXRoIHNvdXJjZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBzb3VyY2VQYXRoID0gcHJvamVjdC5nZXRQYXRoKCkuYXBwZW5kKHNvdXJjZVBhdGgpOwotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VQYXRoLmVxdWFscyhjcFtpXS5nZXRQYXRoKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGNwW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRPU1BhdGgoSVByb2plY3QgcHJvamVjdCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAotICAgICAgICAgICAgSVBhdGggb3V0cHV0UGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvdXRwdXRQYXRoID09IG51bGwpCi0gICAgICAgICAgICBvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSB0aGUgcm9vdCBvZiBhIHByb2plY3QsIHJldHVybiBwcm9qZWN0IGxvY2F0aW9uCi0gICAgICAgIGlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLSAgICAgICAgCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qob3V0cHV0UGF0aC5sYXN0U2VnbWVudCgpKQotICAgICAgICAJCQkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIHByb2plY3QgZm9sZGVyIGxvY2F0aW9uCi0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihvdXRwdXRQYXRoKQotICAgICAgICAgICAgICAgIC5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRGVyaXZlZCBmcm9tIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQoKQotICAgICAqLwotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQoVVJJIHVyaSkgewotCi0JCVN0cmluZyByZXNvdXJjZVR5cGUgPSB1cmkuc2VnbWVudCgxKTsKLQkJVVJJIGNvbnRlbnR1cmkgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub1JlbGF0aXZlUGF0aCh1cmksIDIpOwotCQlTdHJpbmcgY29udGVudE5hbWUgPSBjb250ZW50dXJpLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoImxpYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG1vZHVsZTovY2xhc3NwYXRoL2xpYi9EOi9mb28vZm9vLmphcgotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGNvbnRlbnROYW1lKTsKLQotCQl9IGVsc2UgaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoInZhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kdWxlOi9jbGFzc3BhdGgvdmFyLzxDTEFTU1BBVEhWQVI+L2Zvby5qYXIKLQkJCVN0cmluZyBjbGFzc3BhdGhWYXIgPSBjb250ZW50dXJpLnNlZ21lbnQoMCk7Ci0JCQlVUkkgcmVtYWluaW5nUGF0aHVyaSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvUmVsYXRpdmVQYXRoKGNvbnRlbnR1cmksIDEpOwotCQkJU3RyaW5nIHJlbWFpbmluZ1BhdGggPSByZW1haW5pbmdQYXRodXJpLnRvU3RyaW5nKCk7Ci0KLQkJCVN0cmluZ1tdIGNsYXNzcGF0aHZhcnMgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZU5hbWVzKCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2xhc3NwYXRoVmFyLmVxdWFscyhjbGFzc3BhdGh2YXJzW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCUlQYXRoIHBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShjbGFzc3BhdGhWYXIpOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJVVJJIGZpbmFsdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoLnRvT1NTdHJpbmcoKSArIElQYXRoLlNFUEFSQVRPUiArIHJlbWFpbmluZ1BhdGgpOwotCQkJCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZmluYWx1cmkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywKLQkJCQkJTkxTLmJpbmQoIlRvbWNhdCBwdWJsaXNoaW5nIGNvdWxkIG5vdCByZXNvbHZlIGRlcGVuZGVuY3kgVVJJIFwiezB9XCIuICBBIHZhbHVlIGZvciBjbGFzc3BhdGggdmFyaWFibGUgezF9IHdhcyBub3QgZm91bmQuIiwgdXJpLCBjbGFzc3BhdGhWYXIpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIERlcml2ZWQgZnJvbSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzV2ViQXBwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gZ2V0IHRoZSByYXcgZW50cmllcwotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QpOwotCQlmaW5hbCBNYXAgdmFsaWRSYXdFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBmaWx0ZXIgb3V0IG5vbi12YWxpZCByZWZlcmVuY2VkIHJhdyBlbnRyaWVzCi0JCWZpbmFsIEl0ZXJhdG9yIGkgPSByZWZlcmVuY2VkUmF3RW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSkgcmVmZXJlbmNlZFJhd0VudHJpZXMuZ2V0KGVudHJ5KTsKLQkJCWlmIChpc1ZhbGlkKGVudHJ5LCBhdHRyaWIsIGlzV2ViQXBwLCBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJdmFsaWRSYXdFbnRyaWVzLnB1dChlbnRyeSwgYXR0cmliKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIHdlIGhhdmUgbm8gdmFsaWQgcmF3IGVudHJpZXMsIHJldHVybiBlbXB0eSBtYXAKLQkJaWYgKHZhbGlkUmF3RW50cmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQotCQkvLyBYWFggV291bGQgbGlrZSB0byByZXBsYWNlIHRoZSBjb2RlIGJlbG93IHdpdGggdXNlIG9mIGEgcHVibGljIEpEVCBBUEkgdGhhdCByZXR1cm5zCi0JCS8vIHRoZSByYXcgSUNsYXNzcGF0aEVudHJ5IGZvciBhIGdpdmVuIHJlc29sdmVkIElDbGFzc3BhdGhFbnRyeSAoc2VlIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzOTk1KQotCQkvLyBUaGUgY29kZSBtdXN0IGN1cnJlbnRseSBsZXZlcmFnZSBJUGFja2FnZUZyYWdtZW50Um9vdCB0byBkZXRlcm1pbmUgdGhpcwotCQkvLyBtYXBwaW5nIGFuZCwgYmVjYXVzZSBJUGFja2FnZUZyYWdtZW50Um9vdHMgZG8gbm90IG1haW50YWluIElDbGFzc3BhdGhFbnRyeSBkYXRhLCBhIHByaW9yCi0JCS8vIGNhbGwgaXMgbmVlZGVkIHRvIGdldFJlc29sdmVkQ2xhc3NwYXRoKCkgYW5kIHRoZSByZXNvbHZlZCBJQ2xhc3NwYXRoRW50cmllcyBoYXZlIHRvIGJlIHN0b3JlZCBpbiBhIE1hcCBmcm9tIElQYXRoLXRvLUlDbGFzc3BhdGhFbnRyeSB0bwotCQkvLyBzdXBwb3J0IHJldHJpZXZhbCB1c2luZyB0aGUgcmVzb2x2ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkJCi0JCS8vIHJldHJpZXZlIHRoZSByZXNvbHZlZCBjbGFzc3BhdGgKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQlmaW5hbCBNYXAgcGF0aFRvUmVzb2x2ZWRFbnRyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBzdG9yZSBpbiBhIG1hcCBmcm9tIHBhdGggdG8gZW50cnkKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlwYXRoVG9SZXNvbHZlZEVudHJ5LnB1dChlbnRyaWVzW2pdLmdldFBhdGgoKSwgZW50cmllc1tqXSk7Ci0JCX0KLQotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZEVudHJpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQkKLQkJLy8gZ3JhYiBhbGwgSVBhY2thZ2VGcmFnbWVudFJvb3RzCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHJvb3RzLmxlbmd0aDsgaisrKSB7Ci0JCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbal07Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQkKLQkJCS8vIGlzIHRoZSByYXcgZW50cnkgdmFsaWQ/Ci0JCQlJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IChJQ2xhc3NwYXRoQXR0cmlidXRlKSB2YWxpZFJhd0VudHJpZXMuZ2V0KHJhd0VudHJ5KTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmaW5hbCBJUGF0aCBwa2dGcmFnUGF0aCA9IHJvb3QuZ2V0UGF0aCgpOwotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBwYXRoVG9SZXNvbHZlZEVudHJ5LmdldChwa2dGcmFnUGF0aCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIHJlc29sdmVkQXR0cmliID0gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKHJlc29sdmVkRW50cnkpOwotCQkJLy8gYXR0cmlidXRlIGZvciB0aGUgcmVzb2x2ZWQgZW50cnkgbXVzdCBlaXRoZXIgYmUgdW5zcGVjaWZpZWQgb3IgaXQgbXVzdCBiZSB0aGUKLQkJCS8vIGRlcGVuZGVuY3kgYXR0cmlidXRlIGZvciBpdCB0byBiZSBpbmNsdWRlZAotCQkJaWYgKHJlc29sdmVkQXR0cmliID09IG51bGwgfHwgcmVzb2x2ZWRBdHRyaWIuZ2V0TmFtZSgpLmVxdWFscyhDTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpKSB7Ci0JCQkJLy8gZmlsdGVyIG91dCByZXNvbHZlZCBlbnRyeSBpZiBpdCBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRpb24gcnVsZXMKLQkJCQlpZiAoaXNWYWxpZChyZXNvbHZlZEVudHJ5LCByZXNvbHZlZEF0dHJpYiAhPSBudWxsID8gcmVzb2x2ZWRBdHRyaWIgOiBhdHRyaWIsIGlzV2ViQXBwLCBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCWlmIChyZXNvbHZlZEF0dHJpYiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpZiB0aGVyZSBpcyBhbiBhdHRyaWJ1dGUgb24gdGhlIHN1Yi1lbnRyeSwgdXNlIHRoYXQKLQkJCQkJCWF0dHJpYiA9IHJlc29sdmVkQXR0cmliOwotCQkJCQl9Ci0JCQkJCXJlZmVyZW5jZWRFbnRyaWVzLnB1dChyZXNvbHZlZEVudHJ5LCBhdHRyaWIpOwotCQkJCX0KLQkJCX0gCi0JCX0KLQkJCi0gICAgICAgIHJldHVybiByZWZlcmVuY2VkRW50cmllczsKLQl9Ci0KLQkvKgotCSAqIERlcml2ZWQgZnJvbSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQl9Ci0JCWZpbmFsIE1hcCByZWZlcmVuY2VkUmF3RW50cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZW50cnkpOwotICAgICAgICAgICAgaWYgKGF0dHJpYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJcmVmZXJlbmNlZFJhd0VudHJpZXMucHV0KGVudHJ5LCBhdHRyaWIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWZlcmVuY2VkUmF3RW50cmllczsKLQl9Ci0KLQkvKgotCSAqIERlcml2ZWQgZnJvbSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5jaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIAlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07Ci0JICAgIAlmaW5hbCBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JICAgIAlpZiAobmFtZS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSkgewotCSAgICAJCXJldHVybiBhdHRyaWJ1dGU7Ci0JICAgIAl9Ci0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBEZXJpdmVkIGZyb20gQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci52YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeSgpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIsIGJvb2xlYW4gaXNXZWJBcHAsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaW50IGtpbmQgPSBlbnRyeS5nZXRFbnRyeUtpbmQoKTsKLQkJYm9vbGVhbiBpc0NsYXNzRm9sZGVyID0gaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKLQkJCi0JCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCB8fCBraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgcnVudGltZVBhdGggPSBnZXRSdW50aW1lUGF0aChhdHRyaWIsIGlzV2ViQXBwLCBpc0NsYXNzRm9sZGVyKTsKLQkJaWYgKCFpc1dlYkFwcCkgewotCQkJaWYgKCFydW50aW1lUGF0aC5lcXVhbHMoIi4uLyIpICYmICFydW50aW1lUGF0aC5lcXVhbHMoIi8iKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0NsYXNzRm9sZGVyICYmICFydW50aW1lUGF0aC5lcXVhbHMoIi8iKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsICYmICFydW50aW1lUGF0aC5lcXVhbHMoIi9XRUItSU5GL2xpYiIpCi0JCQkJCSYmICFydW50aW1lUGF0aC5lcXVhbHMoIi9XRUItSU5GL2NsYXNzZXMiKQotCQkJCQkmJiAhcnVudGltZVBhdGguZXF1YWxzKCIuLi8iKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0NsYXNzRm9sZGVyICYmICFydW50aW1lUGF0aC5lcXVhbHMoIi9XRUItSU5GL2NsYXNzZXMiKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBEZXJpdmVkIGZyb20gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NGb2xkZXJFbnRyeShmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9lcyB0aGUgcGF0aCByZWZlciB0byBhIGZpbGUgb3IgYSBmb2xkZXI/Ci0JCWZpbmFsIElQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJSVBhdGggZW50cnlMb2NhdGlvbiA9IGVudHJ5UGF0aDsKLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGVudHJ5UGF0aCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQllbnRyeUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlib29sZWFuIGlzRmlsZSA9IHRydWU7IC8vIGJ5IGRlZmF1bHQsIGFzc3VtZSBhIGphciBmaWxlCi0JCWlmIChlbnRyeUxvY2F0aW9uLnRvRmlsZSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlzRmlsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaXNGaWxlOwotCX0KLQkKLQkvKgotCSAqIERlcml2ZWQgZnJvbSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSdW50aW1lUGF0aCgpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJ1bnRpbWVQYXRoKGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliLCBmaW5hbCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBib29sZWFuIGlzQ2xhc3NGb2xkZXIpIHsKLSAgICAJaWYgKGF0dHJpYiAhPSBudWxsICYmICFhdHRyaWIuZ2V0TmFtZSgpLmVxdWFscyhDTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpKSB7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlpZiAoYXR0cmliID09IG51bGwgfHwgYXR0cmliLmdldFZhbHVlKCk9PSBudWxsIHx8IGF0dHJpYi5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAJCWlmIChpc1dlYkFwcCkgewotICAgIAkJCXJldHVybiBpc0NsYXNzRm9sZGVyID8gIi9XRUJfSU5GL2NsYXNzZXMiIDogIldFQi1JTkYvbGliIjsKLSAgICAJCX0gZWxzZSB7Ci0gICAgCQkJcmV0dXJuIGlzQ2xhc3NGb2xkZXIgPyAiLyIgOiAiLi4vIjsKLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gYXR0cmliLmdldFZhbHVlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDVlOTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEZhY3RvcnkgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSBYTUwgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VOYW1lOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQotCXB1YmxpYyBGYWN0b3J5KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXByb3RlY3RlZCBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgcywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShzKTsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhNTEVsZW1lbnQgY3JlYXRlRWxlbWVudChpbnQgaW5kZXgsIFN0cmluZyBzLCBOb2RlIG5vZGUpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBjcmVhdGVFbGVtZW50KHMsIG5vZGUpOwotCQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwotCQl0cnkgewotCQkJTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwgJiYgIXMuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGNoaWxkICE9IG51bGwgJiYgaSA8IGluZGV4OyBpKyspIHsKLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwgJiYgIXMuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIFRyeSB0byBpbXByb3ZlIGZvcm1hdGluZywgbWF5YmUgZHVwIGFuIGFwcHJvcHJpYXRlIHRleHQgbm9kZQotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJbm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgY2hpbGQpOwotCQkJZWxzZQotCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZShlbGVtZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhNTEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgcywgTm9kZSBub2RlKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocyk7Ci0JCW5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBYTUxVdGlsLmdldENvbnRlbnRzKGRvY3VtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiBwYWNrYWdlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJcmV0dXJuIG5ld0luc3RhbmNlKGVsZW1lbnQpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgbG9hZGluZyBkb2N1bWVudCIsIGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGRvY3VtZW50Iik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MRWxlbWVudCBuZXdJbnN0YW5jZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHMgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCXRyeSB7Ci0JCQkvLyBjaGFuZ2UgIndlYi1hcHA6dGVzdCIgdG8gIldlYkFwcFRlc3QiCi0JCQlzID0gcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKDEpOwotCQkJaW50IGkgPSBzLmluZGV4T2YoIi0iKTsKLQkJCXdoaWxlIChpID49IDApIHsKLQkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaSkgKyBzLnN1YnN0cmluZyhpKzEsIGkrMikudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKGkrMik7Ci0JCQkJaSA9IHMuaW5kZXhPZigiLSIpOwotCQkJfQotCQkJaSA9IHMuaW5kZXhPZigiOiIpOwotCQkJd2hpbGUgKGkgPj0gMCkgewotCQkJCXMgPSBzLnN1YnN0cmluZygwLCBpKSArIHMuc3Vic3RyaW5nKGkrMSwgaSsyKS50b1VwcGVyQ2FzZSgpICsgcy5zdWJzdHJpbmcoaSsyKTsKLQkJCQlpID0gcy5pbmRleE9mKCI6Iik7Ci0JCQl9Ci0JCi0JCQkvLyBhZGQgcGFja2FnZSBuYW1lCi0JCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJCQlzID0gcGFja2FnZU5hbWUgKyAiLiIgKyBzOwotCQkJQ2xhc3MgY2xhc3MxID0gQ2xhc3MuZm9yTmFtZShzKTsKLQkKLQkJCVhNTEVsZW1lbnQgeG1sRWxlbWVudCA9IChYTUxFbGVtZW50KSBjbGFzczEubmV3SW5zdGFuY2UoKTsKLQkJCXhtbEVsZW1lbnQuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCXhtbEVsZW1lbnQuc2V0RmFjdG9yeSh0aGlzKTsKLQkJCXJldHVybiB4bWxFbGVtZW50OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTFV0aWwuc2F2ZShmaWxlbmFtZSwgZG9jdW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkKSB7Ci0JCWRvY3VtZW50ID0gZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHMpIHsKLQkJcGFja2FnZU5hbWUgPSBzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL1hNTEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL1hNTEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYjE1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0vKioKLSAqIEFuIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWxlbWVudCB7Ci0JcHJpdmF0ZSBFbGVtZW50IHhtbEVsZW1lbnQ7Ci0JcHJvdGVjdGVkIEZhY3RvcnkgZmFjdG9yeTsKLQotCXB1YmxpYyBYTUxFbGVtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnROb2RlKCkgewotCQlyZXR1cm4geG1sRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBhZGRBdHRyaWJ1dGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlBdHRyIGF0dHIgPSBmYWN0b3J5LmNyZWF0ZUF0dHJpYnV0ZShzLCB4bWxFbGVtZW50KTsKLQkJYXR0ci5zZXRWYWx1ZShzMSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCXB1YmxpYyBYTUxFbGVtZW50IGNyZWF0ZUVsZW1lbnQoaW50IGluZGV4LCBTdHJpbmcgcykgewotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVFbGVtZW50KGluZGV4LCBzLCB4bWxFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBzKSB7Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQocywgeG1sRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFhNTEVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIHMpIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOwotCQlpbnQgaSA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGopOwotCQkJU3RyaW5nIHMxID0gbm9kZS5nZXROb2RlTmFtZSgpLnRyaW0oKTsKLQkJCWlmIChzMS5lcXVhbHMocykpCi0JCQkJcmV0dXJuIGZhY3RvcnkubmV3SW5zdGFuY2UoKEVsZW1lbnQpIG5vZGUpOwotCQl9Ci0JCi0JCXJldHVybiBjcmVhdGVFbGVtZW50KHMpOwotCX0KLQotCXB1YmxpYyBYTUxFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBzLCBpbnQgaSkgewotCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocyk7Ci0JCWludCBqID0gbm9kZWxpc3QgPT0gbnVsbCA/IDAgOiBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgayA9IDA7IGsgPCBqOyBrKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVsaXN0Lml0ZW0oayk7Ci0JCQlTdHJpbmcgczEgPSBub2RlLmdldE5vZGVOYW1lKCkudHJpbSgpOwotCQkJaWYgKHMxLmVxdWFscyhzKSAmJiBrID09IGkpCi0JCQkJcmV0dXJuIGZhY3RvcnkubmV3SW5zdGFuY2UoKEVsZW1lbnQpIG5vZGUpOwotCQl9Ci0JCi0JCXJldHVybiBjcmVhdGVFbGVtZW50KHMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHMpIHsKLQkJQXR0ciBhdHRyID0geG1sRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHMpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0geG1sRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChudWxsICE9IGF0dHJzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGF0dHIgPSBhdHRycy5pdGVtKGkpOwotCQkJCVN0cmluZyBuYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4geG1sRWxlbWVudC5nZXROb2RlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRWYWx1ZSh4bWxFbGVtZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFZhbHVlKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlyZXR1cm4gczsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJaWYgKG5vZGVsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBUZXh0KQotCQkJCXJldHVybiAoKFRleHQpIG5vZGVsaXN0Lml0ZW0oaSkpLmdldERhdGEoKTsKLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBFbGVtZW50IGdldFN1YkVsZW1lbnQoU3RyaW5nIHMpIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOwotCQlpbnQgaSA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGopOwotCQkJU3RyaW5nIHMxID0gbm9kZS5nZXROb2RlTmFtZSgpLnRyaW0oKTsKLQkJCWlmIChzMS5lcXVhbHMocykpCi0JCQkJcmV0dXJuIChFbGVtZW50KSBub2RlOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViRWxlbWVudFZhbHVlKFN0cmluZyBzKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldFN1YkVsZW1lbnQocyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJU3RyaW5nIHZhbHVlID0gZ2V0RWxlbWVudFZhbHVlKGVsZW1lbnQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIHZhbHVlLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCXhtbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudChTdHJpbmcgcywgaW50IGkpIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOwotCQlpbnQgaiA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgajsgaysrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGspOwotCQkJU3RyaW5nIHMxID0gbm9kZS5nZXROb2RlTmFtZSgpLnRyaW0oKTsKLQkJCWlmIChzMS5lcXVhbHMocykgJiYgayA9PSBpKSB7Ci0JCQkJeG1sRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlBdHRyIGF0dHIgPSB4bWxFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUocyk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlhdHRyID0gYWRkQXR0cmlidXRlKHMsIHMxKTsKLQkJZWxzZQotCQkJYXR0ci5zZXRWYWx1ZShzMSk7Ci0JfQotCi0Jdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQl4bWxFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RWxlbWVudFZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBzID0gZWxlbWVudC5nZXROb2RlVmFsdWUoKTsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXROb2RlVmFsdWUodmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCWlmIChub2RlbGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBub2RlbGlzdC5pdGVtKGkpOwotCQkJCXRleHQuc2V0RGF0YSh2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQlyZXR1cm47Ci0JfQotCi0Jdm9pZCBzZXRGYWN0b3J5KEZhY3RvcnkgZmFjdG9yeTEpIHsKLQkJZmFjdG9yeSA9IGZhY3RvcnkxOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1YkVsZW1lbnRWYWx1ZShTdHJpbmcgcywgU3RyaW5nIHZhbHVlKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldFN1YkVsZW1lbnQocyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCWVsZW1lbnQgPSBmYWN0b3J5LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocyk7Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKGZhY3RvcnkuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoInRlbXAiKSk7Ci0JCQl4bWxFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQl9Ci0JCXNldEVsZW1lbnRWYWx1ZShlbGVtZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplT2ZFbGVtZW50KFN0cmluZyBzKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlyZXR1cm4gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50VmFsdWUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCXhtbEVsZW1lbnQuc2V0Tm9kZVZhbHVlKHMpOwotCQl9IGNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpbnQgaSA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJaWYgKG5vZGVsaXN0Lml0ZW0oaikgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCQkoKFRleHQpIG5vZGVsaXN0Lml0ZW0oaikpLnNldERhdGEocyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJeG1sRWxlbWVudC5hcHBlbmRDaGlsZChmYWN0b3J5LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4geG1sRWxlbWVudC5oYXNDaGlsZE5vZGVzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKCkKLQl7Ci0JCXdoaWxlICh4bWxFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJeG1sRWxlbWVudC5yZW1vdmVDaGlsZCh4bWxFbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weUNoaWxkcmVuVG8oWE1MRWxlbWVudCBkZXN0aW5hdGlvbikgewotCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuID0gbm9kZWxpc3QgPT0gbnVsbCA/IDAgOiBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCWRlc3RpbmF0aW9uLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW1wb3J0Tm9kZShOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkgewotCQl4bWxFbGVtZW50LmFwcGVuZENoaWxkKHhtbEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmltcG9ydE5vZGUobm9kZSwgZGVlcCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIGNvbXBhcmUgdHdvIFhNTEVsZW1lbnRzIGZvciBlcXVpdmFsZW5jZS4gRHVlIHRvCi0JICogdGhlIGxhY2sgb2Ygbm9ybWFsaXphdGlvbiwgdGhleSBhcmVuJ3QgY29tcGFyZWQgZm9yIGVxdWFsaXR5LiBFbGVtZW50cwotCSAqIGFyZSByZXF1aXJlZCB0byBoYXZlIHRoZSBzYW1lIGF0dHJpYnV0ZXMgb3IgdGhlIHNhbWUgbm9kZSB2YWx1ZQotCSAqIGlmIGF0dHJpYnV0ZXMgYXJlbid0IHByZXNlbnQuIEF0dHJpYnV0ZXMgYW5kIG5vZGUgdmFsdWUgYXJlIGFzc3VtZWQKLQkgKiB0byBiZSBtdXR1YWxseSBleGNsdXNpdmUgZm9yIFRvbWNhdCBjb25maWd1cmF0aW9uIFhNTCBmaWxlcy4gVGhlCi0JICogc2FtZSBub24tdGV4dCBjaGlsZCBub2RlcyBhcmUgcmVxdWlyZWQgdG8gYmUgcHJlc2VudCBpbiBhbiBlbGVtZW50Ci0JICogYW5kIGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlci4gSWYgYSBub2RlIHR5cGUgb3RoZXIgdGhhbiBlbGVtZW50IG9yCi0JICogY29tbWVudCBpcyBlbmNvdW50ZXJlZCwgdGhpcyBtZXRob2QgcHVudHMgYW5kIHJldHVybnMgZmFsc2UuCi0JICogCi0JICogQHBhcmFtIG9iaiBYTUxFbGVtZW50IHRvIGNvbXBhcmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBlcXVpdmFsZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KFhNTEVsZW1lbnQgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZWxlbWVudHNBcmVFcXVpdmFsZW50KHhtbEVsZW1lbnQsIG9iai5nZXRFbGVtZW50Tm9kZSgpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIENhdGNoIGFuZCBpZ25vcmUganVzdCB0byBiZSBzYWZlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhbWUgYXMgaXNFcXVpdmFsZW50KCkgYnV0IGRvZXNuJ3QgaWdub3JlIGV4Y2VwdGlvbnMgZm9yIHRlc3QgcHVycG9zZXMuCi0JICogVGhpcyBhdm9pZHMgaGlkaW5nIGFuIGV4cGVjdGVkIG1pc21hdGNoIGJlaGluZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqIFhNTEVsZW1lbnQgdG8gY29tcGFyZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIGVxdWl2YWxlbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRUZXN0KFhNTEVsZW1lbnQgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIGVsZW1lbnRzQXJlRXF1aXZhbGVudCh4bWxFbGVtZW50LCBvYmouZ2V0RWxlbWVudE5vZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlRXF1aXZhbGVudChFbGVtZW50IGVsZW1lbnQsIEVsZW1lbnQgb3RoZXJFbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG90aGVyRWxlbWVudCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKCFlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKG90aGVyRWxlbWVudC5nZXROb2RlTmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJaWYgKG90aGVyRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkgJiYgYXR0cmlidXRlc0FyZUVxdWFsKGVsZW1lbnQsIG90aGVyRWxlbWVudCkpIHsKLQkJCQkvLyBDb21wYXJlIGNoaWxkIG5vZGVzCi0JCQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlOb2RlTGlzdCBvdGhlck5vZGVsaXN0ID0gb3RoZXJFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAobm9kZWxpc3QuZ2V0TGVuZ3RoKCkgPT0gb3RoZXJOb2RlbGlzdC5nZXRMZW5ndGgoKSkgewotCQkJCQlOb2RlIG5vZGUgPSBuZXh0Tm9uVGV4dE5vZGUoZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQkJCQlOb2RlIG90aGVyTm9kZSA9IG5leHROb25UZXh0Tm9kZShvdGhlckVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG90aGVyTm9kZSA9PSBudWxsKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCXNob3J0IG5leHROb2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCQkJCWlmIChuZXh0Tm9kZVR5cGUgIT0gb3RoZXJOb2RlLmdldE5vZGVUeXBlKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJLy8gSWYgZWxlbWVudHMsIGNvbXBhcmUgCi0JCQkJCQlpZiAobmV4dE5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJaWYgKCFlbGVtZW50c0FyZUVxdWl2YWxlbnQoKEVsZW1lbnQpbm9kZSwgKEVsZW1lbnQpb3RoZXJOb2RlKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJLy8gRWxzZSBpZiBjb21tZW50LCBjb21wYXJlCi0JCQkJCQllbHNlIGlmIChuZXh0Tm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCQlpZiAoIW5vZGVWYWx1ZXNBcmVFcXVhbChub2RlLCBvdGhlck5vZGUpKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBFbHNlIHB1bnQgb24gb3RoZXIgbm9kZSB0eXBlcwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJbm9kZSA9IG5leHROb25UZXh0Tm9kZShub2RlLmdldE5leHRTaWJsaW5nKCkpOwotCQkJCQkJb3RoZXJOb2RlID0gbmV4dE5vblRleHROb2RlKG90aGVyTm9kZS5nZXROZXh0U2libGluZygpKTsKLQkJCQkJfQotCQkJCQkvLyBJZiBhbHNvIGF0IGVuZCBvZiBvdGhlciBjaGlsZHJlbiwgcmV0dXJuIGVxdWFsCi0JCQkJCWlmIChvdGhlck5vZGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICghb3RoZXJFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZXNBcmVFcXVhbChlbGVtZW50LCBvdGhlckVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZSBuZXh0Tm9uVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhdHRyaWJ1dGVzQXJlRXF1YWwoRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IG90aGVyRWxlbWVudCkgewotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJTmFtZWROb2RlTWFwIG90aGVyQXR0cnMgPSBvdGhlckVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cnMgPT0gbnVsbCAmJiBvdGhlckF0dHJzID09IG51bGwpIHsKLQkJCS8vIFJldHVybiBjb21wYXJpc29uIG9mIGVsZW1lbnQgdmFsdWVzIGlmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzCi0JCQlyZXR1cm4gbm9kZVZhbHVlc0FyZUVxdWFsKGVsZW1lbnQsIG90aGVyRWxlbWVudCk7Ci0JCX0KLQkJCi0JCWlmIChhdHRycy5nZXRMZW5ndGgoKSA9PSBvdGhlckF0dHJzLmdldExlbmd0aCgpKSB7Ci0JCQlpZiAoYXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCQkvLyBSZXR1cm4gY29tcGFyaXNvbiBvZiBlbGVtZW50IHZhbHVlcyBpZiB0aGVyZSBhcmUgbm8gYXR0cmlidXRlcwotCQkJCXJldHVybiBub2RlVmFsdWVzQXJlRXF1YWwoZWxlbWVudCwgb3RoZXJFbGVtZW50KTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyID0gYXR0cnMuaXRlbShpKTsKLQkJCQlOb2RlIG90aGVyQXR0ciA9IG90aGVyQXR0cnMuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJaWYgKCFub2RlVmFsdWVzQXJlRXF1YWwoYXR0ciwgb3RoZXJBdHRyKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vZGVWYWx1ZXNBcmVFcXVhbChOb2RlIG5vZGUsIE5vZGUgb3RoZXJOb2RlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCVN0cmluZyBvdGhlclZhbHVlID0gb3RoZXJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBvdGhlclZhbHVlICE9IG51bGwpIHsKLQkJCWlmICh2YWx1ZS5lcXVhbHMob3RoZXJWYWx1ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiBvdGhlclZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL1hNTFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL1hNTFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZjFmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGNyZWF0ZSBhbmQgcmVhZCBYTUwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlcjsKLQotCS8qKgotCSAqIFhNTFV0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotCQlpZiAoZG9jdW1lbnRCdWlsZGVyID09IG51bGwpCi0JCQl0cnkgewotCQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOwotCQkJCWZhY3Rvcnkuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhmYWxzZSk7Ci0JCQkJLy9mYWN0b3J5LnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1leHRlcm5hbC1kdGQiLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJCWRvY3VtZW50QnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkJZG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKLQkJCQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiUnJyb3IgY3JlYXRpbmcgZG9jdW1lbnQgYnVpbGRlciIpOwotCQkJfQotCi0JCXJldHVybiBkb2N1bWVudEJ1aWxkZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hpbGQgb2YgdGhlIGdpdmVuIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqCi0JICogQHBhcmFtIGRvYyBhIGRvY3VtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleCBhbiBpbmRleAotCSAqIEBwYXJhbSBub2RlTmFtZSBhIG5vZGUgbmFtZQotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVDaGlsZEVsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsZW1lbnQsIGludCBpbmRleCwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCUVsZW1lbnQgZWxlbWVudDIgPSBkb2MuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlOb2RlTGlzdCBjaGlsZExpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5vZGVOYW1lKTsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZExpc3QuaXRlbShpbmRleCk7Ci0JCQllbGVtZW50Lmluc2VydEJlZm9yZShlbGVtZW50MiwgY2hpbGQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Mik7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNoaWxkIG9mIHRoZSBnaXZlbiBub2RlLgotCSAqCi0JICogQHBhcmFtIGRvYyBhIGRvY3VtZW50Ci0JICogQHBhcmFtIG5vZGUgYSBub2RlCi0JICogQHBhcmFtIG5vZGVOYW1lIGEgbm9kZSBuYW1lCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUNoaWxkRWxlbWVudChEb2N1bWVudCBkb2MsIE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTsKLQkJbm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBnaXZlbiB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUZXh0Q2hpbGRFbGVtZW50KERvY3VtZW50IGRvYywgTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUNoaWxkRWxlbWVudChkb2MsIG5vZGUsIG5hbWUpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50IG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0ciBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cikgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHIpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Q29udGVudHMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlwcmludChuZXcgUHJpbnRTdHJlYW0ob3V0LCB0cnVlLCAiVVRGLTgiKSwgZG9jdW1lbnQpOwotCQkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURhdGEoRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJU3RyaW5nIGRhdGEgPSBkb2N0eXBlLmdldE5hbWUoKTsKLQkJaWYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsKSB7Ci0JCQlkYXRhICs9ICIgUFVCTElDIFwiIiArIGRvY3R5cGUuZ2V0UHVibGljSWQoKSArICJcIiI7Ci0JCQlTdHJpbmcgc3lzdGVtSWQgPSBkb2N0eXBlLmdldFN5c3RlbUlkKCk7Ci0JCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQkJCQlzeXN0ZW1JZCA9ICIiOwotCQkJZGF0YSArPSAiIFwiIiArIHN5c3RlbUlkICsgIlwiIjsKLQkJfSBlbHNlCi0JCQlkYXRhICs9ICIgU1lTVEVNIFwiIiArIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSArICJcIiI7Ci0JCi0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIHN1YmVsZW1lbnRzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICogQHBhcmFtIGVsZW1lbnQgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldE5vZGVJdGVyYXRvcihFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOwotCQotCQlpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlsaXN0LmFkZChub2RlTGlzdC5pdGVtKGkpKTsKLQkKLQkJcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4gV2lsbCByZXR1cm4gIiIgaW5zdGVhZCBvZiBudWxsLgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlVmFsdWUoTm9kZSBub2RlKSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCi0JCWludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJTm9kZSBuID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmIChuIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCVRleHQgdCA9IChUZXh0KSBuOwotCQkJCXJldHVybiB0LmdldE5vZGVWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgYSBzdWJub2RlLgotCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3ViTm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOwotCQlyZXR1cm4gZ2V0Tm9kZVZhbHVlKG5vZGVMaXN0Lml0ZW0oMCkpLnRyaW0oKTsKLQl9Ci0KLQkvKgotCSAqIEluc2VydCB0aGUgZ2l2ZW4gdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0VGV4dChEb2N1bWVudCBkb2MsIE5vZGUgbm9kZSwgU3RyaW5nIHRleHQpIHsKLQkJbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKHRleHQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGkgPSBzID09IG51bGwgPyAwIDogcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGopOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSA2MCA6IC8qICc8JyAqLwotCQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKCImbHQ7Iik7Ci0JCQkJCWJyZWFrOwotCQotCQkJCWNhc2UgNjIgOiAvKiAnPicgKi8KLQkJCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgiJmd0OyIpOwotCQkJCQlicmVhazsKLQkKLQkJCQljYXNlIDM4IDogLyogJyYnICovCi0JCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIiZhbXA7Iik7Ci0JCQkJCWJyZWFrOwotCQotCQkJCWNhc2UgMzQgOiAvKiAnIicgKi8KLQkJCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgiJnF1b3Q7Iik7Ci0JCQkJCWJyZWFrOwotCQotCQkJCWNhc2UgMTAgOiAvKiAnXG4nICovCi0JCQkJY2FzZSAxMyA6IC8qICdccicgKi8KLQkJCQlkZWZhdWx0IDoKLQkJCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJYnJlYWs7Ci0JCi0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludChQcmludFN0cmVhbSBvdXQsIE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOiB7Ci0JCQkJb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOwotCQkJCS8vb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+XG4iKTsKLQkJCQlOb2RlTGlzdCBub2RlbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBzaXplID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCXByaW50KG91dCwgbm9kZWxpc3QuaXRlbShpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOiB7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlKSBub2RlOwotCQkJCW91dC5wcmludCgiPCFET0NUWVBFICIgKyBnZXREb2N1bWVudFR5cGVEYXRhKGRvY1R5cGUpICsgIj5cbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTogewotCQkJCW91dC5wcmludCgnPCcpOwotCQkJCW91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgbWFwLml0ZW0oaSk7Ci0JCQkJCQlvdXQucHJpbnQoJyAnKTsKLQkJCQkJCW91dC5wcmludChhdHRyLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJb3V0LnByaW50KCI9XCIiKTsKLQkJCQkJCW91dC5wcmludChub3JtYWxpemUoYXR0ci5nZXROb2RlVmFsdWUoKSkpOwotCQkJCQkJb3V0LnByaW50KCciJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJaWYgKCFub2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCQkJb3V0LnByaW50KCIvPiIpOwotCQkJCWVsc2UgewotCQkJCQlvdXQucHJpbnQoJz4nKTsKLQkJCQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IG51bUNoaWxkcmVuID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykKLQkJCQkJCXByaW50KG91dCwgbm9kZWxpc3QuaXRlbShpKSk7Ci0JCi0JCQkJCW91dC5wcmludCgiPC8iKTsKLQkJCQkJb3V0LnByaW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCW91dC5wcmludCgnPicpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6IHsKLQkJCQlOb2RlTGlzdCBub2RlbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChub2RlbGlzdCAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJcHJpbnQob3V0LCBub2RlbGlzdC5pdGVtKGkpKTsKLQkKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOiB7Ci0JCQkJb3V0LnByaW50KG5vcm1hbGl6ZShub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuVEVYVF9OT0RFOiB7Ci0JCQkJb3V0LnByaW50KG5vcm1hbGl6ZShub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiB7Ci0JCQkJb3V0LnByaW50KCI8PyIpOwotCQkJCW91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCVN0cmluZyBzID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW91dC5wcmludCgnICcpOwotCQkJCQlvdXQucHJpbnQocyk7Ci0JCQkJfQotCQkJCW91dC5wcmludCgiPz4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREU6IHsKLQkJCQlvdXQucHJpbnQoIjwhLS0iKTsKLQkJCQlvdXQucHJpbnQobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJb3V0LnByaW50KCItLT4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWRlZmF1bHQ6IHsKLQkJCQlvdXQucHJpbnQobm9ybWFsaXplKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlvdXQuZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShTdHJpbmcgZmlsZW5hbWUsIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcmludFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpLCB0cnVlLCAiVVRGLTgiKTsKLQkJCS8vdHJhY2VOb2RlKGRvY3VtZW50LCAiIik7Ci0JCQlwcmludChvdXQsIGRvY3VtZW50KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShTdHJpbmcgZmlsZW5hbWUsIE5vZGUgbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSwgdHJ1ZSwgIlVURi04Iik7Ci0JCQlwcmludChvdXQsIG5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3Vibm9kZQotCSAqCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIHMgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlub2RlLnNldE5vZGVWYWx1ZSh2YWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobm9kZWxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgbm9kZWxpc3QuaXRlbShpKTsKLQkJCQl0ZXh0LnNldERhdGEodmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyMDQ4KTsKLQkJCW91dCA9IG5ldyBQcmludFN0cmVhbShiYW9zKTsKLQkJCXByaW50KG91dCwgZG9jdW1lbnQpOwotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29ubmVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzMjRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBDb25uZWN0b3IoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCQotCXB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gKFBhcmFtZXRlcikgZmluZEVsZW1lbnQoIlBhcmFtZXRlciIsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYXJhbWV0ZXJDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIlBhcmFtZXRlciIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIiwgY2xhc3NOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU2OGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHQgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgQ29udGV4dCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENyb3NzQ29udGV4dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJjcm9zc0NvbnRleHQiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERvY0Jhc2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jQmFzZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicGF0aCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlbG9hZGFibGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicmVsb2FkYWJsZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzb3VyY2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUcnVzdGVkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInRydXN0ZWQiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q3Jvc3NDb250ZXh0KFN0cmluZyBjcm9zc0NvbnRleHQpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNyb3NzQ29udGV4dCIsIGNyb3NzQ29udGV4dCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERvY0Jhc2UoU3RyaW5nIGRvY0Jhc2UpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRvY0Jhc2UiLCBkb2NCYXNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicGF0aCIsIHBhdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWxvYWRhYmxlKFN0cmluZyByZWxvYWRhYmxlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJyZWxvYWRhYmxlIiwgcmVsb2FkYWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJzb3VyY2UiLCBzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUcnVzdGVkKFN0cmluZyB0cnVzdGVkKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJ0cnVzdGVkIiwgdHJ1c3RlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgyOWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0TWFuYWdlciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBDb250ZXh0TWFuYWdlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGZpbmRFbGVtZW50KCJDb25uZWN0b3IiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q29ubmVjdG9yQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJDb25uZWN0b3IiKTsKLQl9Ci0JCi0JcHVibGljIENvbnRleHQgZ2V0Q29udGV4dChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDb250ZXh0KSBmaW5kRWxlbWVudCgiQ29udGV4dCIsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDb250ZXh0Q291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJDb250ZXh0Iik7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEludGVyY2VwdG9yQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJDb250ZXh0SW50ZXJjZXB0b3IiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEhvbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiaG9tZSIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFJlcXVlc3RJbnRlcmNlcHRvckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiUmVxdWVzdEludGVyY2VwdG9yIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvd0RlYnVnSW5mbygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzaG93RGVidWdJbmZvIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya0RpcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJ3b3JrRGlyIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIGhvbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImhvbWUiLCBob21lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0RlYnVnSW5mbyhTdHJpbmcgc2hvd0RlYnVnSW5mbykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgic2hvd0RlYnVnSW5mbyIsIHNob3dEZWJ1Z0luZm8pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXb3JrRGlyKFN0cmluZyB3b3JrRGlyKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJ3b3JrRGlyIiwgd29ya0Rpcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1BhcmFtZXRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDhjZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgUGFyYW1ldGVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgidmFsdWUiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIsIG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInZhbHVlIiwgdmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhjZGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIFNlcnZlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgQ29udGV4dE1hbmFnZXIgZ2V0Q29udGV4dE1hbmFnZXIoKSB7Ci0JCXJldHVybiAoQ29udGV4dE1hbmFnZXIpIGZpbmRFbGVtZW50KCJDb250ZXh0TWFuYWdlciIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExvZ2dlckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiTG9nZ2VyIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXJJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvU2VydmVySW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3MjYzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXJJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU0FTIEluc3RpdHV0ZSwgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIExhcnJ5IElzYWFjcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYSBUb21jYXQgMy4yLCBvciBsYXRlciwgc2VydmVyIGFzCi0gKiBkZWZpbmVkIGEgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJJbnN0YW5jZSB7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXI7Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU2VydmVySW5zdGFuY2UgdXNpbmcgdGhlIHNwZWNpZmllZCBTZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKiBUaGUgU2VydmVySW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIENvbm5lY3RvcnMgYW5kIENvbnRleHRzLiBJdCBkb2VzCi0JICogbm90IHN1cHBvcnQgaW50ZXJhY3Rpbmcgd2l0aCBIb3N0IGVsZW1lbnRzIHVuZGVyIHRoZSBDb250ZXh0TWFuYWdlcgotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBTZXJ2ZXIgY29uZmlndXJhdGlvbiBvbiB3aGljaCB0byBiYXNlIHRoaXMgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlcnZlckluc3RhbmNlKFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VydmVyIGFyZ3VtZW50IG1heSBub3QgYmUgbnVsbC4iKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHByb2JsZW0gc3RhdHVzIGZvbGxvd2luZwotCSAqIGEgbWV0aG9kIGNhbGwgdGhhdCByZXR1cm5lZCA8Yj5udWxsPC9iPiBkdWUgdG8gYW4gZXJyb3IuCi0JICogQHJldHVybiBTdGF0dXMgb2YgbGFzdCBtZXRob2QgY2FsbC4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dE1hbmFnZXIgZWxlbWVudCBpZiBvbmUgZXhpc3RzIG9yIHdpbGwKLQkgKiBjcmVhdGUgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gZXhpc3Rpbmcgb3IgbmV3IENvbnRleHRNYW5nZXIuCi0JICovCi0JcHVibGljIENvbnRleHRNYW5hZ2VyIGdldENvbnRleHRNYW5hZ2VyKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCkKLQkJCWNvbnRleHRNYW5hZ2VyID0gc2VydmVyLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0JCXJldHVybiBjb250ZXh0TWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29ubmVjdG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIGEgQ29ubmVjdG9yCi0JICogZG9lcyBub3QgZXhpc3QgYXQgdGhhdCBpbmRleCBhIG5ldyBDb25uZWN0b3IgaXMgYXBwZW5kZWQKLQkgKiBhbmQgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBDb25uZWN0b3IgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgQ29ubmVjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb3IKLQkgKiBhIG5ldyBDb25uZWN0b3IgaWYgb25lIGF0IHRoYXQgaW5kZXggZG9lc24ndCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihpbnQgaW5kZXgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJcmV0dXJuIGNvbnRleHRNYW5hZ2VyLmdldENvbm5lY3RvcihpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQ29ubmVjdG9ycyBmb3VuZCBpbiB0aGUgQ29udGV4dE1hbmFnZXIgaW4gdGhlCi0JICogc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogICAgCi0JICogQHJldHVybiBBcnJheSBvZiBDb25uZWN0b3JzIGZvdW5kIGluIHRoZSBDb250ZXh0TWFuZ2VyIGluIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgW10gZ2V0Q29ubmVjdG9ycygpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJaW50IHNpemUgPSBjb250ZXh0TWFuYWdlci5nZXRDb25uZWN0b3JDb3VudCgpOwotCQlDb25uZWN0b3IgW10gY29ubmVjdG9ycyA9IG5ldyBDb25uZWN0b3IgW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29ubmVjdG9yc1tpXSA9IGNvbnRleHRNYW5hZ2VyLmdldENvbm5lY3RvcihpKTsKLQkJfQotCQlyZXR1cm4gY29ubmVjdG9yczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHBhdGggd2l0aGluIHRoZSBzZWxlY3RlZAotCSAqIEhvc3QuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxiPm51bGw8L2I+IGlmIHRoZSBDb250ZXh0IHdpdGggdGhlCi0JICogcmVxdWlyZWQgcGF0aCBpcyBub3QgZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0UGF0aCBQYXRoIG9mIHRoZSBDb250ZXh0IHRvIGJlIHJldHVybmVkLiAgQSBsZWFkaW5nICcvJyBpcyBvcHRpb25hbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIENvbnRleHQgd2hvc2UgPGI+cGF0aDwvYj4gYXR0cmlidXRlIG1hdGNoZXMKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRleHRQYXRoLiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBDb250ZXh0IHdpdGgKLQkgKiB0aGUgcmVxdWlyZWQgcGF0aCBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIENvbnRleHQgZ2V0Q29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJaWYgKGNvbnRleHRQYXRoICE9IG51bGwgJiYgY29udGV4dFBhdGgubGVuZ3RoKCkgPiAwICYmICFjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQljb250ZXh0UGF0aCA9ICIvIiArIGNvbnRleHRQYXRoOwotCQkKLQkJaW50IHNpemUgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbnRleHQgY3R4ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChpKTsKLQkJCWlmIChjdHguZ2V0UGF0aCgpLmVxdWFscyhjb250ZXh0UGF0aCkpIHsKLQkJCQlyZXR1cm4gY3R4OwotCQkJfQotCQl9Ci0JCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yWE1MQ29udGV4dE5vdEZvdW5kUGF0aDMyLCBjb250ZXh0UGF0aCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBhIENvbm5lY3RvciBkb2VzIG5vdAotCSAqIGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGEgbmV3IENvbnRleHQgd2lsbCBiZSBhcHBlbmRlZCBhbmQKLQkgKiByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIENvbnRleHQgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgQ29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBvcgotCSAqIGEgbmV3IGFwcGVuZGVkIENvbnRleHQgaWYgdGhlIGluZGV4IGlzIGJleW9uZCBhbnkgZXhpc3RpbmcKLQkgKiBDb250ZXh0cy4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCAmJiBnZXRDb250ZXh0TWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJLy8gTm90ZTogQ2FuJ3QgY3VycmVudGx5IG9jY3VyCi0JCQotCQlyZXR1cm4gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHRzIGNvbnRhaW5lZCBpbiB0aGUgQ29udGV4dE1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBBcnJheSBvZiBDb250ZXh0cyBjb250YWluZWQgaW4gdGhlIENvbnRleHRNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBDb250ZXh0IFtdIGdldENvbnRleHRzKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCAmJiBnZXRDb250ZXh0TWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJLy8gTm90ZTogQ2FuJ3QgY3VycmVudGx5IG9jY3VyCi0JCQotCQlpbnQgc2l6ZSA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHRDb3VudCgpOwotCQlDb250ZXh0IFtdIGNvbnRleHRzID0gbmV3IENvbnRleHQgW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29udGV4dHNbaV0gPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KGkpOwotCQl9Ci0JCXJldHVybiBjb250ZXh0czsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBDb250ZXh0IGFuZCBpbnNlcnRzIGl0IGJlZm9yZSB0aGUgc3BlY2lmZWQgaW5kZXgKLQkgKiBvciBhcHBlbmRzIGl0IGlmIHRoZSBpbmRleCBpcyBiZXlvbmQgYW55IGV4aXN0aW5nIENvbnRleHRzIGluIHRoZQotCSAqIENvbnRleHRNYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBwcmlvciB0byB3aGljaCB0byBpbnNlcnQgdGhlIG5ldyBDb250ZXh0cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNyZWF0ZWQgQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBjcmVhdGVDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCAmJiBnZXRDb250ZXh0TWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJLy8gTm90ZTogQ2FuJ3QgY3VycmVudGx5IG9jY3VyCi0KLQkJcmV0dXJuIChDb250ZXh0KWNvbnRleHRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnQoaW5kZXgsICJDb250ZXh0Iik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIENvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgsIGlmIGl0IGNhbiBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFBhdGggUGF0aCBvZiB0aGUgQ29udGV4dCB0byBiZSByZW1vdmVkLiAgQSBsZWFkaW5nICcvJyBpcyBvcHRpb25hbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgPGI+dHJ1ZTwvYj4gaWYgdGhlIENvbnRleHQgd2FzIHJlbW92ZWQuICBSZXR1cm5zIDxiPmZhbHNlPC9iPgotCSAqIGlmIHRoZSBDb250ZXh0IGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb250ZXh0KFN0cmluZyBjb250ZXh0UGF0aCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCAmJiBnZXRDb250ZXh0TWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJaWYgKGNvbnRleHRQYXRoICE9IG51bGwgJiYgY29udGV4dFBhdGgubGVuZ3RoKCkgPiAwICYmICFjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQljb250ZXh0UGF0aCA9ICIvIiArIGNvbnRleHRQYXRoOwotCQkKLQkJaW50IHNpemUgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbnRleHQgY3R4ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChpKTsKLQkJCWlmIChjdHguZ2V0UGF0aCgpLmVxdWFscyhjb250ZXh0UGF0aCkpIHsKLQkJCQljb250ZXh0TWFuYWdlci5yZW1vdmVFbGVtZW50KCJDb250ZXh0IiwgaSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoMzIsIGNvbnRleHRQYXRoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBDb250ZXh0IHRvIHJlbW92ZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgPGI+dHJ1ZTwvYj4gaWYgYSBDb250ZXh0IGlzIHJlbW92ZWQgYXQgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LiAgUmV0dXJucyA8Yj5mYWxzZTwvYj4gbm8gQ29udGV4dCBleGlzdHMgYXQgdGhhdCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoY29udGV4dE1hbmFnZXIgPT0gbnVsbCAmJiBnZXRDb250ZXh0TWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCi0JCXJldHVybiBjb250ZXh0TWFuYWdlci5yZW1vdmVFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIAotCSAqIENvbnRleHQuIElmIHRoZSB3b3JrIGRpcmVjdG9yeSBvYnRhaW5lZCBpcyByZWxhdGl2ZSwKLQkgKiBpdCBpcyBhcHBlbmRlZCB0byB0aGUgc3BlY2lmaWVkIGJhc2UgcGF0aC4gVGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdCB2ZXJpZnkgaWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGN1cnJlbnRseSBleGlzdHMuIAotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aCBQYXRoIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4KLQkgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdob3NlIHdvcmsgZGlyZWN0b3J5IHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmZWQKLQkgKiBDb250ZXh0LgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZXh0IGFyZ3VtZW50IG1heSBub3QgYmUgbnVsbC4iKTsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCi0JCVN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyB3b3JrRGlyID0gY29udGV4dE1hbmFnZXIuZ2V0V29ya0RpcigpOwotCQlpZiAod29ya0RpciA9PSBudWxsKQotCQkJd29ya0RpciA9ICJ3b3JrIjsKLQkJc2IuYXBwZW5kKHdvcmtEaXIpOwotCQlzYi5hcHBlbmQoIi8iKTsKLQkJU3RyaW5nIGhvc3ROYW1lID0gY29udGV4dE1hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoImhvc3ROYW1lIik7Ci0JCWlmIChob3N0TmFtZSA9PSBudWxsKQotCQkJaG9zdE5hbWUgPSAibG9jYWxob3N0IjsKLQkJc2IuYXBwZW5kKGhvc3ROYW1lKTsKLQkJc2IuYXBwZW5kKCJfIik7Ci0JCVN0cmluZyBsZWdhY3lQb3J0ID0gY29udGV4dE1hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoInBvcnQiKTsKLQkJaWYgKGxlZ2FjeVBvcnQgPT0gbnVsbCkKLQkJCWxlZ2FjeVBvcnQgPSAiODA4MCI7Ci0JCXNiLmFwcGVuZChsZWdhY3lQb3J0KTsKLQkJLy8gRHVwbGljYXRlIFVSTEVuY29kZXIuZW5jb2RlKCkgdXNlZCBpbiBUb21jYXQgMy4yCi0JCXNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShjb250ZXh0LmdldFBhdGgoKSkpOwotCi0JCUlQYXRoIHdvcmtQYXRoID0gbmV3IFBhdGgoc2IudG9TdHJpbmcoKSk7Ci0JCWlmICghd29ya1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlpZiAoYmFzZVBhdGggPT0gbnVsbCkKLQkJCQliYXNlUGF0aCA9IG5ldyBQYXRoKCIiKTsKLQkJCXdvcmtQYXRoID0gYmFzZVBhdGguYXBwZW5kKHdvcmtQYXRoKTsKLQkJfQotCQlyZXR1cm4gd29ya1BhdGg7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLiAKLQkgKiBJZiB0aGUgd29yayBkaXJlY3Rvcnkgb2J0YWluZWQgaXMgcmVsYXRpdmUsCi0JICogaXQgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIFBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIElQYXRoIGdldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCi0JCVN0cmluZyB3b3JrRGlyID0gY29udGV4dE1hbmFnZXIuZ2V0V29ya0RpcigpOwotCQlpZiAod29ya0RpciA9PSBudWxsKQotCQkJd29ya0RpciA9ICJ3b3JrIjsKLQkJSVBhdGggd29ya1BhdGggPSBuZXcgUGF0aCh3b3JrRGlyKTsKLQkJaWYgKCF3b3JrUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCWlmIChiYXNlUGF0aCA9PSBudWxsKQotCQkJCWJhc2VQYXRoID0gbmV3IFBhdGgoIiIpOwotCQkJd29ya1BhdGggPSBiYXNlUGF0aC5hcHBlbmQod29ya1BhdGgpOwotCQl9Ci0JCXJldHVybiB3b3JrUGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0Nvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWJmNmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0Nvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIENvbm5lY3RvcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0Q291bnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiYWNjZXB0Q291bnQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXhQcm9jZXNzb3JzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm1heFByb2Nlc3NvcnMiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1pblByb2Nlc3NvcnMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibWluUHJvY2Vzc29ycyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwb3J0Iik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdXJlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInNlY3VyZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInByb3RvY29sIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXB0Q291bnQoU3RyaW5nIGFjY2VwdENvdW50KSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJhY2NlcHRDb3VudCIsIGFjY2VwdENvdW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIiwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1heFByb2Nlc3NvcnMoU3RyaW5nIG1heFByb2Nlc3NvcnMpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm1heFByb2Nlc3NvcnMiLCBtYXhQcm9jZXNzb3JzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaW5Qcm9jZXNzb3JzKFN0cmluZyBtaW5Qcm9jZXNzb3JzKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJtaW5Qcm9jZXNzb3JzIiwgbWluUHJvY2Vzc29ycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydChTdHJpbmcgcG9ydCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicG9ydCIsIHBvcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoU3RyaW5nIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lIiwgcHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2E4ZGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHQgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENvbnRleHQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVidWcgYXR0cmlidXRlLgotCSAqIEByZXR1cm4gZGVidWcgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCS8qKgotCSAqIEdldCBkb2NCYXNlIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIGRvY0Jhc2UgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRvY0Jhc2UiKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGF0aCBhdHRyaWJ1dGUuCi0JICogQHJldHVybiBwYXRoIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwYXRoIik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJlbG9hZGFibGUgYXR0cmlidXRlLgotCSAqIEByZXR1cm4gcmVsb2FkYWJsZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbG9hZGFibGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicmVsb2FkYWJsZSIpOwotCX0KLQotCS8qKgotCSAqIEdldCBXVFAgc291cmNlIGF0dHJpYnV0ZS4gTGlua3MgdGhlIGNvbnRleHQKLQkgKiB0byBhIHByb2plY3QgbW9kdWxlLgotCSAqIEByZXR1cm4gc291cmNlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInNvdXJjZSIpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZXh0IFJlc291cmNlcyBlbGVtZW50LiAgV2lsbCBjcmVhdGUKLQkgKiB0aGUgZWxlbWVudCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSAqIEByZXR1cm4gcmVzb3VyY2VzIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFJlc291cmNlcyBnZXRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VzKSBmaW5kRWxlbWVudCgiUmVzb3VyY2VzIik7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRleHQgTG9hZGVyIGVsZW1lbnQuICBXaWxsIGNyZWF0ZQotCSAqIHRoZSBlbGVtZW50IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JICogQHJldHVybiBsb2FkZXIgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTG9hZGVyIGdldExvYWRlcigpIHsKLQkJcmV0dXJuIChMb2FkZXIpIGZpbmRFbGVtZW50KCJMb2FkZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGRlYnVnIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBkZWJ1ZyB2YWx1ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQotCS8qKgotCSAqIFNldCBkb2NCYXNlIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gZG9jQmFzZSB2YWx1ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkb2NCYXNlIiwgZG9jQmFzZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHBhdGggYXR0cmlidXRlLgotCSAqIEBwYXJhbSBwYXRoIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBhdGgiLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgcmVsb2FkYWJsZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIHJlbG9hZGFibGUgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShTdHJpbmcgcmVsb2FkYWJsZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicmVsb2FkYWJsZSIsIHJlbG9hZGFibGUpOwotCX0KLQotCS8qKgotCSAqIFNldCBXVFAgc291cmNlIGF0dHJpYnV0ZS4gTGlua3MgdGhlIGNvbnRleHQKLQkgKiB0byBhIHByb2plY3QgbW9kdWxlLgotCSAqIEBwYXJhbSBzb3VyY2UgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInNvdXJjZSIsIHNvdXJjZSk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwOWY4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9FbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW5naW5lIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIEVuZ2luZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFwcEJhc2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiYXBwQmFzZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlZmF1bHRIb3N0Iik7Ci0JfQotCQotCXB1YmxpYyBIb3N0IGdldEhvc3QoKSB7Ci0JCXJldHVybiAoSG9zdCkgZmluZEVsZW1lbnQoIkhvc3QiKTsKLQl9Ci0JCi0JcHVibGljIEhvc3QgZ2V0SG9zdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChIb3N0KSBmaW5kRWxlbWVudCgiSG9zdCIsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIb3N0Q291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJIb3N0Iik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFwcEJhc2UoU3RyaW5nIGFwcEJhc2UpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImFwcEJhc2UiLCBhcHBCYXNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRIb3N0KFN0cmluZyBkZWZhdWx0SG9zdCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVmYXVsdEhvc3QiLCBkZWZhdWx0SG9zdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Ib3N0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Ib3N0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTEwOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvSG9zdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSG9zdCBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBIb3N0KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwQmFzZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJhcHBCYXNlIik7Ci0JfQotCQotCXB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29udGV4dCkgZmluZEVsZW1lbnQoIkNvbnRleHQiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dENvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29udGV4dCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFwcEJhc2UoU3RyaW5nIGFwcEJhc2UpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImFwcEJhc2UiLCBhcHBCYXNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNzhiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgTGlzdGVuZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Mb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViN2NjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Mb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBGYWJyaXppbyBHaXVzdGluYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MRWxlbWVudDsKLQotLyoqCi0gKiBMb2FkZXIgZWxlbWVudCwgb3B0aW9uYWwgaW4gQ29udGV4dC4KLSAqLwotcHVibGljIGNsYXNzIExvYWRlciBleHRlbmRzIFhNTEVsZW1lbnQgewotCi0JLyoqCi0JICogR2V0IGNsYXNzTmFtZSBhdHRyaWJ1dGUuCi0gICAgICogQHJldHVybiBjbGFzc05hbWUgYXR0cmlidXRlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGNsYXNzTmFtZSBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB2YWx1ZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBzZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIiwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1RQIHZpcnR1YWxDbGFzc3BhdGggYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gdmlydHVhbENsYXNzcGF0aCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmlydHVhbENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJ2aXJ0dWFsQ2xhc3NwYXRoIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFdUUCB2aXJ0dWFsQ2xhc3NwYXRoIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gdmlydHVhbENsYXNzcGF0aCB2YWx1ZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXJ0dWFsQ2xhc3NwYXRoKFN0cmluZyB2aXJ0dWFsQ2xhc3NwYXRoKSB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVZhbHVlKCJ2aXJ0dWFsQ2xhc3NwYXRoIiwgdmlydHVhbENsYXNzcGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgYXR0cmlidXRlCi0gICAgICogQHJldHVybiB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCgKLSAgICAgICAgICAgIFN0cmluZyB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50KSB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVZhbHVlKCJ1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IiwKLSAgICAgICAgICAgICAgICB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1Jlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjNlNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgRmFicml6aW8gR2l1c3RpbmEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTEVsZW1lbnQ7Ci0KLS8qKgotICogUmVzb3VyY2VzIGVsZW1lbnQsIG9wdGlvbmFsIGluIENvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQotCS8qKgotCSAqIEdldCBjbGFzc05hbWUgYXR0cmlidXRlCi0JICogQHJldHVybiBjbGFzc05hbWUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHZpcnR1YWxDbGFzc3BhdGggYXR0cmlidXRlLgotCSAqIEByZXR1cm4gdmlydHVhbENsYXNzcGF0aCBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpcnR1YWxDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgidmlydHVhbENsYXNzcGF0aCIpOwotCX0KLQotCS8qKgotCSAqIFNldCBjbGFzc05hbWUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBjbGFzc05hbWUgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHZpcnR1YWxDbGFzc3BhdGggYXR0cmlidXRlLgotCSAqIEBwYXJhbSB2aXJ0dWFsQ2xhc3NwYXRoIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpcnR1YWxDbGFzc3BhdGgoU3RyaW5nIHZpcnR1YWxDbGFzc3BhdGgpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInZpcnR1YWxDbGFzc3BhdGgiLCB2aXJ0dWFsQ2xhc3NwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTcxMTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIFNlcnZlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicG9ydCIpOwotCX0KLQkKLQlwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKGludCBpbmRleCkgewotCQlyZXR1cm4gKFNlcnZpY2UpIGZpbmRFbGVtZW50KCJTZXJ2aWNlIiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlcnZpY2VDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIlNlcnZpY2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaHV0ZG93bigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzaHV0ZG93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIiwgbmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHBvcnQpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBvcnQiLCBwb3J0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2h1dGRvd24oU3RyaW5nIHNodXRkb3duKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJzaHV0ZG93biIsIHNodXRkb3duKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdGVuZXIgZ2V0TGlzdGVuZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoTGlzdGVuZXIpIGZpbmRFbGVtZW50KCJMaXN0ZW5lciIsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMaXN0ZW5lckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiTGlzdGVuZXIiKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmVySW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlckluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjM2ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmVySW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFNBUyBJbnN0aXR1dGUsIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBMYXJyeSBJc2FhY3MgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYSBUb21jYXQgNC4wLCBvciBsYXRlciwgc2VydmVyIGFzCi0gKiBkZWZpbmVkIGJ5IGEgc3BlY2lmaWMgU2VydmljZSwgRW5naW5lLCBhbmQgSG9zdCBkZWZpbmVkIGluIGEgc2VydmVyLnhtbAotICogY29uZmlndXJhdGlvbiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVySW5zdGFuY2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJDYXRhbGluYSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFMiA9ICJUb21jYXQtU3RhbmRhbG9uZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9IT1NUID0gImxvY2FsaG9zdCI7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlOwotCXByb3RlY3RlZCBFbmdpbmUgZW5naW5lOwotCXByb3RlY3RlZCBIb3N0IGhvc3Q7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZW5naW5lTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3ROYW1lOwotCQotCXByb3RlY3RlZCBTdHJpbmcgaG9zdFdvcmtEaXI7Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNlcnZlckluc3RhbmNlIHVzaW5nIHRoZSBzcGVjaWZpZWQgU2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogVGhlIFNlcnZlckluc3RhbmNlIHByb3ZpZGVzIGFjY2VzcyB0byBhIHNlbGVjdGVkIFNlcnZpY2UsIEVuZ2luZSwgYW5kIEhvc3QKLQkgKiBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBzdXBwbGllZCBzZXJ2aWNlIGFuZCBob3N0IG5hbWUgb3IgdGhlaXIgZGVmYXVsdHMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBTZXJ2ZXIgY29uZmlndXJhdGlvbiBvbiB3aGljaCB0byBiYXNlIHRoaXMgaW5zdGFuY2UuCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgdGhlIHNlcnZpY2UgdGhlIGluc3RhbmNlIHNob3VsZCB1c2UuICBEZWZhdWx0cwotCSAqICB0byAmcXVvdDtDYXRhbGluYSZxdW90OyBpZiA8Yj5udWxsPC9iPiBvciBhbnkgZW1wdHkgc3RyaW5nIGlzIHNwZWNpZmllZC4KLQkgKiBAcGFyYW0gaG9zdE5hbWUgTmFtZSBvZiB0aGUgaG9zdCB0aGUgaW5zdGFuY2Ugc2hvdWxkIHVzZS4gRGVmYXVsdHMgdG8KLQkgKiAgdGhlIGRlZmF1bHRIb3N0IHNldHRpbmcgb24gdGhlIEVuZ2luZSBlbGVtZW50IGZvdW5kIHVuZGVyIHRoZSBzZXJ2aWNlLgotCSAqICBJZiB0aGUgZGVmYXVsdEhvc3QgaXMgbm90IHNldCwgZGVmYXVsdHMgdG8gJnF1b3Q7bG9jYWxob3N0JnF1b3Q7LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJJbnN0YW5jZShTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBob3N0TmFtZSkgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXJ2ZXIgYXJndW1lbnQgbWF5IG5vdCBiZSBudWxsLiIpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCQl0aGlzLmhvc3ROYW1lID0gaG9zdE5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBwcm9ibGVtIHN0YXR1cyBmb2xsb3dpbmcKLQkgKiBhIG1ldGhvZCBjYWxsIHRoYXQgcmV0dXJuZWQgPGI+bnVsbDwvYj4gZHVlIHRvIGFuIGVycm9yLgotCSAqIEByZXR1cm4gU3RhdHVzIG9mIGxhc3QgbWV0aG9kIGNhbGwuCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFycmF5IG9mIExpc3RlbmVycyBmb3VuZCBpbiB0aGUgU2VydmVyIGNvbmZpZ3VyYXRpb24KLQkgKiBvZiB0aGlzIFNlcnZlckluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gQXJyYXkgb2YgTGlzdGVuZXJzIGZvdW5kIGluIHRoZSBTZXJ2ZXIgY29uZmlndXJhdGlvbi4gCi0JICovCi0JcHVibGljIExpc3RlbmVyIFtdIGdldExpc3RlbmVycygpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXJDb3VudCgpOwotCQlMaXN0ZW5lciBbXSBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXIgW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJbGlzdGVuZXJzW2ldID0gc2VydmVyLmdldExpc3RlbmVyKGkpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWQgU2VydmljZSBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gb2YKLQkgKiB0aGlzIFNlcnZlckluc3RhbmNlLiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIDxiPm51bGw8L2I+IGlmIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBTZXJ2aWNlIHdpdGggdGhlIG5hbWUKLQkgKiBzZWxlY3RlZCBpbiB0aGlzIFNlcnZlckluc3RhbmNlLiBJZiBubyBuYW1lIGlzIHNlbGVjdGVkLCB0aGVuCi0JICogYSBzZXJ2aWNlIGlzIGNob3NlbiBhcyBmb2xsb3dzLiAgSWYgdGhlcmUgaXMgb25seSBvbmUgU2VydmljZSwKLQkgKiBpdCBpcyByZXR1cm5lZC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBTZXJ2aWNlcywgdGhlIGZpcnN0IG9uZQotCSAqIHdpdGggdGhlIG5hbWUgJnF1b3Q7Q2F0YWxpbmEmcXVvdDsgb3IgJnF1b3Q7VG9tY2F0LVN0YW5kYWxvbmUmcXVvdDsKLQkgKiBpcyByZXR1cm5lZC4gIElmIG5vbmUgaXMgZm91bmQgd2l0aCBlaXRoZXIgbmFtZSwgdGhlIGZpcnN0Ci0JICogU2VydmljZSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGVkIFNlcnZpY2UgZm9yIHRoaXMgU2VydmVySW5zdGFuY2UuIFJldHVybnMgPGI+bnVsbDwvYj4KLQkgKiBpZiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgY29udGFpbiBhIFNlcnZpY2Ugd2l0aCB0aGUgc2VsZWN0ZWQgbmFtZQotCSAqIG9yIGRvZXMgbm90IGNvbnRhaW4gYSBTZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChzZXJ2aWNlICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmljZTsKLQkJCi0JCWludCBzZXJ2aWNlQ291bnQgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCS8vIElmIHNlcnZpY2UgbmFtZSBpcyBzcGVjaWZpZWQsIHJlcXVpcmUgdGhhdCBuYW1lCi0JCWlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VDb3VudDsgaSsrKSB7Ci0JCQkJU2VydmljZSBzdmMgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShzdmMuZ2V0TmFtZSgpKSkgewotCQkJCQlzZXJ2aWNlID0gc3ZjOwotCQkJCQlyZXR1cm4gc2VydmljZTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JYTUxTZXJ2aWNlTm90Rm91bmQsIHNlcnZpY2VOYW1lKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzZXJ2aWNlLCByZXR1cm4gdGhhdCBvbmUKLQkJaWYgKHNlcnZpY2VDb3VudCA9PSAxKSB7Ci0JCQlzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoMCk7Ci0JCQlzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCX0KLQkJLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpY2VzLCB0cnkgdG8gZmluZCBhIGRlZmF1bHQgbmFtZQotCQlpZiAoc2VydmljZUNvdW50ID4gMSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlQ291bnQ7IGkrKykgewotCQkJCVNlcnZpY2Ugc3ZjID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJU3RyaW5nIHN2Y05hbWUgPSBzdmMuZ2V0TmFtZSgpOwotCQkJCWlmIChERUZBVUxUX1NFUlZJQ0UuZXF1YWxzSWdub3JlQ2FzZShzdmMuZ2V0TmFtZSgpKSkgewotCQkJCQlzZXJ2aWNlID0gc3ZjOwotCQkJCQlzZXJ2aWNlTmFtZSA9IHN2Y05hbWU7Ci0JCQkJCXJldHVybiBzZXJ2aWNlOwotCQkJCX0KLQkJCQlpZiAoREVGQVVMVF9TRVJWSUNFMi5lcXVhbHNJZ25vcmVDYXNlKHN2Yy5nZXROYW1lKCkpKSB7Ci0JCQkJCXNlcnZpY2UgPSBzdmM7Ci0JCQkJCXNlcnZpY2VOYW1lID0gc3ZjTmFtZTsKLQkJCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIGZpcnN0IHNlcnZpY2UKLQkJCXNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZSgwKTsKLQkJCXNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gc2VydmljZTsKLQkJfQotCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlNZXNzYWdlcy5lcnJvclhNTE5vU2VydmljZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbm5lY3RvciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBhIENvbm5lY3RvcgotCSAqIGRvZXMgbm90IGV4aXN0IGF0IHRoYXQgaW5kZXggYSBuZXcgQ29ubmVjdG9yIGlzIGFwcGVuZGVkCi0JICogYW5kIHJldHVybmVkLiAgVGhpcyBtZXRob2QgY2FsbCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPgotCSAqIGlmIHRoZSBzZWxlY3RlZCBTZXJ2aWNlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzZXJ2ZXIKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgQ29ubmVjdG9yIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIENvbm5lY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9yCi0JICogYSBuZXcgQ29ubmVjdG9yIGlmIG9uZSBhdCB0aGF0IGluZGV4IGRvZXNuJ3QgZXhpc3QuCi0JICogUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgU2VydmljZSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChzZXJ2aWNlID09IG51bGwgJiYgZ2V0U2VydmljZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBzZXJ2aWNlLmdldENvbm5lY3RvcihpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQ29ubmVjdG9ycyBmb3VuZCBpbiB0aGUgc2VsZWN0ZWQgU2VydmljZSBpbiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKiAgICAKLQkgKiBAcmV0dXJuIEFycmF5IG9mIENvbm5lY3RvcnMgZm91bmQgaW4gdGhlIHNlbGVjdGVkIFNlcnZpY2UgaW4gdGhlCi0JICogc2VydmVyIGNvbmZpZ3VyYXRpb24uICBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZAotCSAqIFNlcnZpY2UgY2FuIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIFtdIGdldENvbm5lY3RvcnMoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChzZXJ2aWNlID09IG51bGwgJiYgZ2V0U2VydmljZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gc2VydmljZS5nZXRDb25uZWN0b3JDb3VudCgpOwotCQlDb25uZWN0b3IgW10gY29ubmVjdG9ycyA9IG5ldyBDb25uZWN0b3IgW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29ubmVjdG9yc1tpXSA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGkpOwotCQl9Ci0JCXJldHVybiBjb25uZWN0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzZWxlY3RlZCBFbmdpbmUgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mCi0JICogdGhpcyBTZXJ2ZXJJbnN0YW5jZS4gVGhlIEVuZ2luZSBpcyBzZWxlY3RlZCBieSBiZWluZyB0aGUKLQkgKiBvbmUgY2hpbGQgRW5naW5lIG9mIHRoZSBzZWxlY3RlZCBTZXJ2aWNlLiBUaGUgbWV0aG9kIHdpbGwKLQkgKiByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIFNlcnZpY2UgaXMgbm90IGZvdW5kCi0JICogaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9yIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JICogZG9lcyBub3QgY29udGFpbiBhIGNoaWxkIEVuZ2luZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9uZSBFbmdpbmUgdGhhdCBpcyBhIGNoaWxkIG9mIHRoZQotCSAqIHNlbGVjdGVkIFNlcnZpY2UuIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkCi0JICogU2VydmljZSBpcyBub3QgZm91bmQgb3IgaXQgY29udGFpbnMgbm8gY2hpbGQgRW5naW5lLgotCSAqLwotCXB1YmxpYyBFbmdpbmUgZ2V0RW5naW5lKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoZW5naW5lICE9IG51bGwpCi0JCQlyZXR1cm4gZW5naW5lOwotCi0JCWlmIChzZXJ2aWNlID09IG51bGwgJiYgZ2V0U2VydmljZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWVuZ2luZSA9IHNlcnZpY2UuZ2V0RW5naW5lKCk7Ci0JCWlmIChlbmdpbmUgPT0gbnVsbCB8fCBlbmdpbmUuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclhNTEVuZ2luZU5vdEZvdW5kLCBzZXJ2aWNlTmFtZSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZW5naW5lTmFtZSA9IGVuZ2luZS5nZXROYW1lKCk7Ci0JCWlmIChob3N0TmFtZSA9PSBudWxsIHx8IGhvc3ROYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWhvc3ROYW1lID0gZW5naW5lLmdldERlZmF1bHRIb3N0KCk7Ci0JCQlpZiAoaG9zdE5hbWUgPT0gbnVsbCkKLQkJCQlob3N0TmFtZSA9IERFRkFVTFRfSE9TVDsKLQkJfQotCQlyZXR1cm4gZW5naW5lOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzZWxlY3RlZCBIb3N0IGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvZgotCSAqIHRoaXMgU2VydmVySW5zdGFuY2UuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxiPm51bGw8L2I+Ci0JICogaWYgc2VsZWN0ZWQgRW5naW5lIGlzIG5vdCBmb3VuZCBvciB0aGUgc2VsZWN0ZWQgRW5naW5lCi0JICogZG9lcyBub3QgY29udGFpbiBhIEhvc3Qgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhpcwotCSAqIFNlcnZlckluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VsZWN0ZWQgSG9zdCBmb3IgdGhpcyBTZXJ2ZXJJbnN0YW5jZS4KLQkgKiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBFbmdpbmUgaXMgbm90IGZvdW5kCi0JICogb3IgaXQgZG9lcyBub3QgY29udGFpbiBhIEhvc3Qgd2l0aCB0aGUgZXhwZWN0ZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgSG9zdCBnZXRIb3N0KCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCAhPSBudWxsKQotCQkJcmV0dXJuIGhvc3Q7Ci0JCQotCQlpZiAoZW5naW5lID09IG51bGwgJiYgZ2V0RW5naW5lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHNpemUgPSBlbmdpbmUuZ2V0SG9zdENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlIb3N0IGggPSBlbmdpbmUuZ2V0SG9zdChpKTsKLQkJCWlmIChob3N0TmFtZS5lcXVhbHMoaC5nZXROYW1lKCkpKSB7Ci0JCQkJaG9zdCA9IGg7Ci0JCQkJcmV0dXJuIGhvc3Q7Ci0JCQl9Ci0JCX0KLQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JYTUxIb3N0Tm90Rm91bmQsIG5ldyBTdHJpbmcgW10geyBob3N0TmFtZSwgZW5naW5lTmFtZSwgc2VydmljZU5hbWUgfSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHBhdGggd2l0aGluIHRoZSBzZWxlY3RlZAotCSAqIEhvc3QuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IG9yCi0JICogQ29udGV4dCB3aXRoIHRoZSByZXF1aXJlZCBwYXRoIGlzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggb2YgdGhlIENvbnRleHQgdG8gYmUgcmV0dXJuZWQuICBBIGxlYWRpbmcgJy8nIGlzIG9wdGlvbmFsLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgQ29udGV4dCB3aG9zZSA8Yj5wYXRoPC9iPiBhdHRyaWJ1dGUgbWF0Y2hlcwotCSAqIHRoZSBzcGVjaWZpZWQgY29udGV4dFBhdGguIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkCi0JICogSG9zdCBvciBhIENvbnRleHQgd2l0aCB0aGUgcmVxdWlyZWQgcGF0aCBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIENvbnRleHQgZ2V0Q29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKGNvbnRleHRQYXRoICE9IG51bGwgJiYgY29udGV4dFBhdGgubGVuZ3RoKCkgPiAwICYmICFjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQljb250ZXh0UGF0aCA9ICIvIiArIGNvbnRleHRQYXRoOwotCQkKLQkJaW50IHNpemUgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ29udGV4dCBjdHggPSBob3N0LmdldENvbnRleHQoaSk7Ci0JCQlpZiAoY3R4LmdldFBhdGgoKS5lcXVhbHMoY29udGV4dFBhdGgpKSB7Ci0JCQkJcmV0dXJuIGN0eDsKLQkJCX0KLQkJfQotCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGgsCi0JCQkJCQluZXcgU3RyaW5nIFtdIHsgY29udGV4dFBhdGgsIHNlcnZpY2VOYW1lLCBlbmdpbmVOYW1lLCBob3N0TmFtZSB9KSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBDb250ZXh0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggd2l0aGluIHRoZSBzZWxlY3RlZAotCSAqIEhvc3QuIElmIGEgQ29ubmVjdG9yIGRvZXMgbm90IGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsCi0JICogYSBuZXcgQ29udGV4dCB3aWxsIGJlIGFwcGVuZGVkIGFuZCByZXR1cm5lZC4gVGhpcyBtZXRob2Qgd2lsbAotCSAqIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBjYW4gbm90IGJlIGZvdW5kIGluIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgQ29udGV4dCB0byByZXR1cm4uCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBDb250ZXh0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yCi0JICogYSBuZXcgYXBwZW5kZWQgQ29udGV4dCBpZiB0aGUgaW5kZXggaXMgYmV5b25kIGFueSBleGlzdGluZwotCSAqIENvbnRleHRzLiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGNhbiBub3QKLQkgKiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gaG9zdC5nZXRDb250ZXh0KGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dHMgY29udGFpbmVkIGluIHRoZSBzZWxlY3RlZCBIb3N0LiAgVGhpcwotCSAqIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBjYW4KLQkgKiBub3QgYmUgZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQXJyYXkgb2YgQ29udGV4dHMgY29udGFpbmVkIGluIHRoZSBzZWxlY3RlZCBIb3N0LgotCSAqIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb250ZXh0IFtdIGdldENvbnRleHRzKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IGhvc3QuZ2V0Q29udGV4dENvdW50KCk7Ci0JCUNvbnRleHQgW10gY29udGV4dHMgPSBuZXcgQ29udGV4dCBbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljb250ZXh0c1tpXSA9IGhvc3QuZ2V0Q29udGV4dChpKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dHM7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQ29udGV4dCBhbmQgaW5zZXJ0cyBpdCBiZWZvcmUgdGhlIHNwZWNpZmVkIGluZGV4Ci0JICogb3IgYXBwZW5kcyBpdCBpZiB0aGUgaW5kZXggaXMgYmV5b25kIGFueSBleGlzdGluZyBDb250ZXh0cyBpbiB0aGUKLQkgKiBzZWxlY3RlZCBIb3N0LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQKLQkgKiBIb3N0IGlzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluZGV4IEluZGV4IHByaW9yIHRvIHdoaWNoIHRvIGluc2VydCB0aGUgbmV3IENvbnRleHRzLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3JlYXRlZCBDb250ZXh0LiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZQotCSAqIHNlbGVjdGVkIEhvc3QgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb250ZXh0IGNyZWF0ZUNvbnRleHQoaW50IGluZGV4KSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChob3N0ID09IG51bGwgJiYgZ2V0SG9zdCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKENvbnRleHQpaG9zdC5jcmVhdGVFbGVtZW50KGluZGV4LCAiQ29udGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBDb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLCBpZiBpdCBjYW4gYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggb2YgdGhlIENvbnRleHQgdG8gYmUgcmVtb3ZlZC4gIEEgbGVhZGluZyAnLycgaXMgb3B0aW9uYWwuCi0JICogQHJldHVybiBSZXR1cm5zIDxiPnRydWU8L2I+IGlmIHRoZSBDb250ZXh0IHdhcyByZW1vdmVkLiAgUmV0dXJucyA8Yj5mYWxzZTwvYj4KLQkgKiBpZiB0aGUgQ29udGV4dCBvciB0aGUgc2VsZWN0ZWQgSG9zdCBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChjb250ZXh0UGF0aCAhPSBudWxsICYmIGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCAmJiAhY29udGV4dFBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJY29udGV4dFBhdGggPSAiLyIgKyBjb250ZXh0UGF0aDsKLQkJCi0JCWludCBzaXplID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbnRleHQgY3R4ID0gaG9zdC5nZXRDb250ZXh0KGkpOwotCQkJaWYgKGN0eC5nZXRQYXRoKCkuZXF1YWxzKGNvbnRleHRQYXRoKSkgewotCQkJCWhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yWE1MQ29udGV4dE5vdEZvdW5kUGF0aCwKLQkJCQkJCW5ldyBTdHJpbmcgW10geyBjb250ZXh0UGF0aCwgc2VydmljZU5hbWUsIGVuZ2luZU5hbWUsIGhvc3ROYW1lIH0pKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIENvbnRleHQgdG8gcmVtb3ZlLgotCSAqIEByZXR1cm4gUmV0dXJucyA8Yj50cnVlPC9iPiBpZiBhIENvbnRleHQgaXMgcmVtb3ZlZCBhdCB0aGUgc3BlY2lmaWVkCi0JICogaW5kZXguICBSZXR1cm5zIDxiPmZhbHNlPC9iPiBubyBDb250ZXh0IGV4aXN0cyBhdCB0aGF0IGluZGV4IG9yCi0JICogdGhlIHNlbGVjdGVkIEhvc3QgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbnRleHQoaW50IGluZGV4KSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChob3N0ID09IG51bGwgJiYgZ2V0SG9zdCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjb250ZXh0IFhNTCBmaWxlcyBhcmUgc3RvcmVkCi0JICogZm9yIHRoZSBzZWxlY3RlZCBTZXJ2aWNlLCBFbmdpbmUsIGFuZCBIb3N0IGZvdW5kIGluIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPgotCSAqIGlmIHRoZSBzZWxlY3RlZCBIb3N0IGlzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZEaXIgUGF0aCB0byB0aGUgJnF1b3Q7Y29uZiZxdW90OyBkaXJlY3RvcnkgZm9yCi0JICogdGhlIHNlcnZlci4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGNvbnRleHQgWE1MIGRpcmVjdG9yeS4KLQkgKiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGNhbiBub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIElQYXRoIGdldENvbnRleHRYbWxEaXJlY3RvcnkoSVBhdGggY29uZkRpcikgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gY29uZkRpci5hcHBlbmQoZW5naW5lTmFtZSkuYXBwZW5kKGhvc3ROYW1lKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgWE1MIGZpbGUgdGhhdCB3b3VsZCBiZSB1c2VkCi0JICogaWYgdGhpcyBjb250ZXh0IHdlcmUgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZpbGVzLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgcmV0dXJuIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGlzCi0JICogbm90IGZvdW5kIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gVGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdCB2ZXJpZnkgaWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGN1cnJlbnRseSBleGlzdHMKLQkgKiB3aXRoaW4gdGhlIHNlbGVjdGVkIEhvc3QuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgUGF0aCB0byB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIuCi0JICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aG9zZSBjb250ZXh0IFhNTCBmaWxlIHBhdGggdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgY29udGV4dCBYTUwgZmlsZSBmb3IgdGhlIHNwZWNpZmVkCi0JICogQ29udGV4dC4gUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBjYW4gbm90IGJlCi0JICogZm91bmQgb3IgdGhlIGNvbnRleHQgaGFzIG5vIHBhdGggYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0RmlsZVBhdGgoSVBhdGggYmFzZURpciwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yWE1MTnVsbENvbnRleHRBcmcpOwotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggY29udGV4dEZpbGVQYXRoID0gbnVsbDsKLQkJSVBhdGggY29udGV4dERpciA9IGdldENvbnRleHRYbWxEaXJlY3RvcnkoYmFzZURpci5hcHBlbmQoImNvbmYiKSk7Ci0JCVN0cmluZyBuYW1lID0gY29udGV4dC5nZXRQYXRoKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJCW5hbWUgPSAiUk9PVCI7Ci0JCQljb250ZXh0RmlsZVBhdGggPSBjb250ZXh0RGlyLmFwcGVuZChuYW1lICsgIi54bWwiKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE8gU2V0IGVycm9yIHN0YXR1cwotCQl9Ci0JCXJldHVybiBjb250ZXh0RmlsZVBhdGg7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIAotCSAqIENvbnRleHQuIElmIHRoZSB3b3JrIGRpcmVjdG9yeSBvYnRhaW5lZCBpcyByZWxhdGl2ZSwKLQkgKiBpdCBpcyBhcHBlbmRlZCB0byB0aGUgc3BlY2lmaWVkIGJhc2UgcGF0aC4gVGhpcyBtZXRob2QKLQkgKiB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBpcyBub3QKLQkgKiBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uICBUaGlzIG1ldGhvZCBkb2VzCi0JICogbm90IHZlcmlmeSBpZiB0aGUgc3BlY2lmaWVkIENvbnRleHQgY3VycmVudGx5IGV4aXN0cwotCSAqIHdpdGhpbiB0aGUgc2VsZWN0ZWQgSG9zdC4gCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIFBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hvc2Ugd29yayBkaXJlY3RvcnkgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZlZAotCSAqIENvbnRleHQuIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgY2FuIG5vdCBiZQotCSAqIGZvdW5kLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yWE1MTnVsbENvbnRleHRBcmcpOwotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gSWYgdGhlIHdvcmsgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBvbiB0aGUgY29udGV4dCwgdXNlIHRoYXQgb25lCi0JCVN0cmluZyB3b3JrRGlyID0gY29udGV4dC5nZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIpOwotCQlpZiAod29ya0RpciA9PSBudWxsKSB7Ci0JCQkvLyBJZiBjb250ZXh0IGRvZXNuJ3Qgc3BlY2lmeSB0aGUgd29yayBkaXJlY3RvcnksIGNoZWNrIHRoZSBob3N0Ci0JCQlpZiAoaG9zdFdvcmtEaXIgPT0gbnVsbCkgewotCQkJCWhvc3RXb3JrRGlyID0gaG9zdC5nZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIpOwotCQkJCWlmIChob3N0V29ya0RpciA9PSBudWxsIHx8IGhvc3RXb3JrRGlyLmxlbmd0aCgpID09IDApCi0JCQkJCS8vIElmIGhvc3QgZG9lc24ndCBzcGVjaWZ5IHRoZSB3b3JrIGRpcmVjdG9yeSwgYnVpbGQgdGhlIGRlZmF1bHQKLQkJCQkJaG9zdFdvcmtEaXIgPSAid29yay8iICsgZW5naW5lTmFtZSArICIvIiArIGhvc3ROYW1lOwotCQkJfQotCQkJU3RyaW5nIGN0eE5hbWUgPSBjb250ZXh0LmdldFBhdGgoKTsKLQkJCWlmIChjdHhOYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQljdHhOYW1lID0gY3R4TmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQljdHhOYW1lID0gY3R4TmFtZS5yZXBsYWNlKCcvJywgJ18nKTsKLQkJCWN0eE5hbWUgPSBjdHhOYW1lLnJlcGxhY2UoJ1xcJywgJ18nKTsKLQkJCWlmIChjdHhOYW1lLmxlbmd0aCgpID09IDApCi0JCQkJY3R4TmFtZSA9ICJfIjsKLQkJCXdvcmtEaXIgPSBob3N0V29ya0RpciArICIvIiArIGN0eE5hbWU7Ci0JCX0KLQkJSVBhdGggd29ya1BhdGggPSBuZXcgUGF0aCh3b3JrRGlyKTsKLQkJaWYgKCF3b3JrUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCWlmIChiYXNlUGF0aCA9PSBudWxsKQotCQkJCWJhc2VQYXRoID0gbmV3IFBhdGgoIiIpOwotCQkJd29ya1BhdGggPSBiYXNlUGF0aC5hcHBlbmQod29ya1BhdGgpOwotCQl9Ci0JCXJldHVybiB3b3JrUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIAotCSAqIEhvc3QuIElmIHRoZSB3b3JrIGRpcmVjdG9yeSBvYnRhaW5lZCBpcyByZWxhdGl2ZSwKLQkgKiBpdCBpcyBhcHBlbmRlZCB0byB0aGUgc3BlY2lmaWVkIGJhc2UgcGF0aC4gVGhpcyBtZXRob2QKLQkgKiB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBpcyBub3QKLQkgKiBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIFBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBzZWxlY3RlZAotCSAqIEhvc3QuIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgY2FuIG5vdCBiZQotCSAqIGZvdW5kLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRIb3N0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIElmIGNvbnRleHQgZG9lc24ndCBzcGVjaWZ5IHRoZSB3b3JrIGRpcmVjdG9yeSwgY2hlY2sgdGhlIGhvc3QKLQkJaWYgKGhvc3RXb3JrRGlyID09IG51bGwpIHsKLQkJCWhvc3RXb3JrRGlyID0gaG9zdC5nZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIpOwotCQkJaWYgKGhvc3RXb3JrRGlyID09IG51bGwgfHwgaG9zdFdvcmtEaXIubGVuZ3RoKCkgPT0gMCkKLQkJCQkvLyBJZiBob3N0IGRvZXNuJ3Qgc3BlY2lmeSB0aGUgd29yayBkaXJlY3RvcnksIGJ1aWxkIHRoZSBkZWZhdWx0Ci0JCQkJaG9zdFdvcmtEaXIgPSAid29yay8iICsgZW5naW5lTmFtZSArICIvIiArIGhvc3ROYW1lOwotCQl9Ci0JCUlQYXRoIHdvcmtQYXRoID0gbmV3IFBhdGgoaG9zdFdvcmtEaXIpOwotCQlpZiAoIXdvcmtQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJaWYgKGJhc2VQYXRoID09IG51bGwpCi0JCQkJYmFzZVBhdGggPSBuZXcgUGF0aCgiIik7Ci0JCQl3b3JrUGF0aCA9IGJhc2VQYXRoLmFwcGVuZCh3b3JrUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyNGE0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIFNlcnZpY2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGZpbmRFbGVtZW50KCJDb25uZWN0b3IiLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb25uZWN0b3JDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkNvbm5lY3RvciIpOwotCX0KLQotCXB1YmxpYyBFbmdpbmUgZ2V0RW5naW5lKCkgewotCQlyZXR1cm4gKEVuZ2luZSkgZmluZEVsZW1lbnQoIkVuZ2luZSIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdmVyaWZ5SW5zdGFsbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3ZlcmlmeUluc3RhbGwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzYzE2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdmVyaWZ5SW5zdGFsbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHRoaXMgZmlsZSBtdXN0IG5vdCBiZSB0cmFuc2xhdGVkCi0KLXZlcmlmeTMyaW5zdGFsbD1saWIvamFzcGVyLmphcixsaWIvc2VydmxldC5qYXJ8W3NlcnZsZXRhcGkzXS5qYXIsYmluLGNvbmYsd2ViYXBwcwotdmVyaWZ5NDBpbnN0YWxsPWxpYi9uYW1pbmctZmFjdG9yeS5qYXIsYmluL2Jvb3RzdHJhcC5qYXIsY29uZix3ZWJhcHBzCi12ZXJpZnk0MWluc3RhbGw9Y29tbW9uL2xpYi9uYW1pbmctZmFjdG9yeS5qYXIsY29tbW9uL2xpYi9zZXJ2bGV0Lmphcnxbc2VydmxldGFwaTRdLmphcixiaW4vYm9vdHN0cmFwLmphcixjb25mLHdlYmFwcHMKLXZlcmlmeTUwaW5zdGFsbD1jb21tb24vbGliL3NlcnZsZXQtYXBpLmphcnxbc2VydmxldGFwaTVdLmphcixjb21tb24vbGliL25hbWluZy1jb21tb24uamFyLGJpbi9ib290c3RyYXAuamFyLGNvbmYsd2ViYXBwcwotdmVyaWZ5NTVpbnN0YWxsPWNvbW1vbi9pMThuLGJpbi9ib290c3RyYXAuamFyLGNvbmYsd2ViYXBwcwotdmVyaWZ5NjBpbnN0YWxsPWxpYi9qYXNwZXItZWwuamFyLGxpYi9zZXJ2bGV0LWFwaS5qYXJ8W3NlcnZsZXRhcGk2XS5qYXIsYmluL2Jvb3RzdHJhcC5qYXIsY29uZix3ZWJhcHBzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmViODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0b21jYXR1aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MWYyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aV8zLjAuMC5qYXIKLXRvbWNhdHVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiMDNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxZjc1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZjA4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE3OjAxOjU2IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGJkZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jRnJpIE5vdiAxMCAxODowNjoxMSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDZlOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI01vbiBKYW4gMTUgMjE6NTY6NDggRVNUIDIwMDcKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWEzMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNDk3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSB0b21jYXR1aS8KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfZXh0ZW5zaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9leHRlbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTg1MDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9leHRlbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX21hcHBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX21hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThlNGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3BvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM1NGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjRjMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi90b21jYXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi90b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIwZjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL3dpemJhbi90b21jYXRfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvd2l6YmFuL3RvbWNhdF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1NjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvd2l6YmFuL3RvbWNhdF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGM5YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9QXBhY2hlIFRvbWNhdCBVSSBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlPU1vZHVsZXMKLQotY2xlYW5Ub21jYXRXb3JrRGlyPUNsZWFuIFRvbWNhdCBXb3JrIERpcmVjdG9yeS4uLgotY2xlYW5Ub21jYXRNb2R1bGVXb3JrRGlyPUNsZWFuIE1vZHVsZSBXb3JrIERpcmVjdG9yeS4uLgotCi1wdWJsaXNoZXJDb250ZXh0Rml4TGFiZWw9VXBkYXRlIGNvbnRleHQgcGF0aHMKLXB1Ymxpc2hlckNvbnRleHRGaXhEZXNjcmlwdGlvbj1Qcm9tcHQgdG8gdXBkYXRlIG1vZHVsZSBjb250ZXh0cyB3aGVuIHRoZXkgYXJlIG91dCBvZiBzeW5jLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhZWZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjYwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiLz4KLQotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIvPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1Ii8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MCIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLnByb3BlcnR5VGVzdGVyIgotICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIKLSAgICAgICAgIHByb3BlcnRpZXM9Imhhc0NvbmZpZ3VyYXRpb24iCi0gICAgICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRlc3RlciI+Ci0gICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb25maWd1cmF0aW9uLmVkaXRvci53ZWJtb2R1bGUiCi0gICAgICAgICBvcmRlcj0iMjAiCi0gICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3IuQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5oYXNDb25maWd1cmF0aW9uIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZVNlY3Rpb25zIj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuc2VydmVyLmVkaXRvci5pbnN0YW5jZSIKLSAgICAgICAgIG9yZGVyPSIwIgotICAgICAgICAgaW5zZXJ0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24iLz4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuc2VydmVyLmVkaXRvci5nZW5lcmFsIgotICAgICAgICAgb3JkZXI9IjUiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcubGVmdCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uIi8+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvbmZpZ3VyYXRpb24uZWRpdG9yLnBvcnQiCi0gICAgICAgICBvcmRlcj0iMTAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvci5Db25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24iPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5oYXNDb25maWd1cmF0aW9uIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb25maWd1cmF0aW9uLmVkaXRvci5taW1lIgotICAgICAgICAgb3JkZXI9IjIwIgotICAgICAgICAgaW5zZXJ0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LnJpZ2h0IgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3IuQ29uZmlndXJhdGlvbk1pbWVFZGl0b3JTZWN0aW9uIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaGFzQ29uZmlndXJhdGlvbiIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvc2VjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZEZyYWdtZW50cyI+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjMyIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlIgotICAgICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiI+Ci0gICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLSAgICA8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICBwYXRoPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLlJ1bnRpbWVMYWJlbFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuc2VydmVyYWN0aW9ucyIKLSAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciI+Ci0gICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICA8b2JqZWN0U3RhdGUgbmFtZT0ic2VydmVyVHlwZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiLz4KLSAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDxhY3Rpb24gCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5hY3Rpb25zLkNsZWFuV29ya0RpckFjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmNsZWFuc2VydmVyd29ya2RpciIKLSAgICAgICAgbGFiZWw9IiVjbGVhblRvbWNhdFdvcmtEaXIiPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLnNlcnZlcmFjdGlvbnMiCi0gICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxvYmplY3RTdGF0ZSBuYW1lPSJzZXJ2ZXJUeXBlIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIvPgotICAgICAgICAgIDxvYmplY3RTdGF0ZSBuYW1lPSJtb2R1bGVUeXBlIiB2YWx1ZT0ianN0LndlYiIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmFjdGlvbnMuQ2xlYW5Xb3JrRGlyQWN0aW9uIgotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuY2xlYW5tb2R1bGV3b3JrZGlyIgotICAgICAgICBsYWJlbD0iJWNsZWFuVG9tY2F0TW9kdWxlV29ya0RpciI+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnB1Ymxpc2hlcnMiPgotICAgICA8cHVibGlzaGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5jb250ZXh0IgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICBuYW1lPSIlcHVibGlzaGVyQ29udGV4dEZpeExhYmVsIgotICAgICAgICBkZXNjcmlwdGlvbj0iJXB1Ymxpc2hlckNvbnRleHRGaXhEZXNjcmlwdGlvbiIKLSAgICAgICAgb3JkZXI9IiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRQdWJsaXNoZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ2xlYW5Xb3JrRGlyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NsZWFuV29ya0RpckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGE5ZDg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ2xlYW5Xb3JrRGlyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91cjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXI7Ci0KLS8qKgotICogRGlhbG9nIHRvIGNvbmZpcm0gZGVsZXRpb24gb2YgdGhlIHdvcmsgZGlyZWN0b3J5IGZvciBhIG1vZHVsZSBvbiBhCi0gKiBzZXJ2ZXIsIG9yIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIGVudGlyZSBzZXJ2ZXIuICBIYW5kbGluZwotICogaW5jbHVkZXMgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgdGhlIHNlcnZlciBpZiBpdCBpcyBydW5uaW5nIGF0Ci0gKiB0aGUgdGltZSBvZiB0aGUgZGVsZXRpb24uIAotICoKLSAqLwotcHVibGljIGNsYXNzIENsZWFuV29ya0RpckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgaW50IHN0YXRlOwotCXByb3RlY3RlZCBTdHJpbmcgbW9kZTsKLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb21wbGV0aW9uU3RhdHVzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkaWFsb2cgaW5zdGFuY2UgY29uZmlybSBkZWxldGlvbiBvZiB0aGUgd29yayBkaXJlY3RvcnkgZm9yIGEKLQkgKiBtb2R1bGUgb24gYSBzZXJ2ZXIsIG9yIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIGVudGlyZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhCi0JICogIHRvcC1sZXZlbCBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgc2VydmVyIG9uIHdoaWNoIHRvIGRlbGV0ZSB0aGUgd29yayBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB3aG9zZSB3b3JrIGRpcmVjdG9yeSBpcyB0byBiZSBkZWxldGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICBpZiB0aGVzZSBzZXJ2ZXIncyBlbnRpcmUgd29yayBkaXJlY3RvcnkgaXMgdG8gYmUgZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgQ2xlYW5Xb3JrRGlyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChNZXNzYWdlcy5jb25maXJtQ2xlYW5Xb3JrRGlyVGl0bGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgCi0JCQljYXB0dXJlU2VydmVyU3RhdGUoKTsKLQotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJLy8gU2luY2UgdGhlcmUgYXJlIG9ubHkgbGFiZWwgd2lkZ2V0cyBvbiB0aGlzIHBhZ2UsIHNldCB0aGUgaGVscCBvbiB0aGUgcGFyZW50Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBDb250ZXh0SWRzLlNFUlZFUl9DTEVBTl9XT1JLX0RJUik7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSB7Ci0JCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmNsZWFuU2VydmVyU3RhdGVDaGFuZ2luZywgc2VydmVyLmdldE5hbWUoKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuY2xlYW5Nb2R1bGVXb3JrRGlyLCBtb2R1bGUuZ2V0TmFtZSgpLCBzZXJ2ZXIuZ2V0TmFtZSgpKSk7Ci0JCQllbHNlCi0JCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5jbGVhblNlcnZlcldvcmtEaXIsIHNlcnZlci5nZXROYW1lKCkpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuY2xlYW5TZXJ2ZXJSdW5uaW5nKTsKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCX0KLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0KLQkJaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIAotCQkJY2FwdHVyZVNlcnZlclN0YXRlKCk7Ci0KLQkJLy8gSWYgc2VydmVyIGlzIHRyYW5zaXRpb25pbmcsIG9ubHkgYWxsb3cgQ2FuY2VsCi0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQlpZiAoYnV0dG9uICE9IG51bGwpCi0JCQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgam9iTmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmNsZWFuU2VydmVyVGFzaywKLQkJCQltb2R1bGUgIT0gbnVsbCA/IG1vZHVsZS5nZXROYW1lKCkgOiBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJLy8gQ3JlYXRlIGpvYiB0byBwZXJmb3JtIHRoZSBjbGVhbmluZywgaW5jbHVkaW5nIHN0b3BwaW5nIGFuZCBzdGFydGluZyB0aGUgc2VydmVyIGlmIG5lY2Vzc2FyeQotCQlDbGVhbldvcmtEaXJKb2Igam9iID0gbmV3IENsZWFuV29ya0RpckpvYihqb2JOYW1lKTsKLQkJLy8gTm90ZTogU2luY2Ugc3RvcCBhbmQgc3RhcnQsIGlmIG5lZWRlZCwgd2lsbCBzZXQgc2NoZWR1bGluZyBydWxlcyBpbiB0aGVpciBqb2JzLAotCQkvLyBkb24ndCBzZXQgb25lIGhlcmUuIEluc3RlYWQgZG8gdGhlIGFjdHVhbCBkZWxldGlvbiBpbiBhIGNoaWxkIGpvYiB0b28gd2l0aCB0aGUKLQkJLy8gc2NoZWR1bGluZyBydWxlIG9uIHRoYXQgam9iLCBsaWtlIHN0b3AgYW5kIHN0YXJ0LgotCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkKLQkvKgotCSAqIEpvYiB0byBjbGVhbiB0aGUgYXBwcm9wcmlhdGUgVG9tY2F0IHdvcmsgZGlyZWN0b3J5LiAgSXQgaW5jbHVkZXMKLQkgKiBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlciBpZiB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBydW5uaW5nLgotCSAqIFRoZSBzdG9wcGluZywgZGVsZXRpb24sIGFuZCBzdGFydGluZyBhcmUgYWxsIGRvbmUgd2l0aCBjaGlsZCBqb2JzLAotCSAqIGVhY2ggdXNpbmcgdGhlIHNlcnZlciBzY2hlZHVsaW5nIHJ1bGUuICBUaHVzLCB0aGlzIGpvYiBzaG91bGQKLQkgKiBub3QgdXNlIHRoaXMgcnVsZSBvciBpdCB3aWxsIGJsb2NrIHRoZXNlIGNoaWxkIGpvYnMuIAotCSAqLwotCWNsYXNzIENsZWFuV29ya0RpckpvYiBleHRlbmRzIEpvYiB7Ci0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZSBuYW1lIGZvciBqb2IKLQkJICovCi0JCXB1YmxpYyBDbGVhbldvcmtEaXJKb2IoU3RyaW5nIGpvYk5hbWUpIHsKLQkJCXN1cGVyKGpvYk5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSm9iI2JlbG9uZ3NUbyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkuZXF1YWxzKGZhbWlseSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0KLQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gbnVsbDsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCXdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKW1vZHVsZS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAod2ViTW9kdWxlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2FudElkZW50aWZ5V2ViQXBwLCBtb2R1bGUuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBzdGF0ZSBoYXMgY2hhbmdlZCBzaW5jZSBkaWFsb2cgd2FzIG9wZW4sIGFib3J0Ci0JCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gc3RhdGUpIHsKLQkJCQlyZXR1cm4gbmV3RXJyb3JTdGF0dXMoCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90Q2xlYW5TdGF0ZUNoYW5nZSwgc2VydmVyLmdldE5hbWUoKSksIG51bGwpOwotCQkJfQotCi0JCQlJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJY29tcGxldGlvblN0YXR1cyA9IHJlc3VsdDsKLQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkvLyBJZiBzZXJ2ZXIgaXNuJ3Qgc3RvcHBlZCwgdHJ5IHRvIHN0b3AsIGNsZWFuLCBhbmQgcmVzdGFydAotCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCXN0YXR1cyA9IHNlcnZlci5jYW5TdG9wKCk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiB3cmFwRXJyb3JTdGF0dXMoc3RhdHVzLCAKLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90Q2xlYW5DYW50U3RvcCwgc2VydmVyLmdldE5hbWUoKSkpOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCWJvb2xlYW4gZm9yY2UgPSBmYWxzZTsKLQkJCQl3aGlsZSAoIWRvbmUpIHsKLQkJCQkJLy8gU3RvcCB0aGUgc2VydmVyIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uCi0JCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCXNlcnZlci5zdG9wKGZvcmNlLCBsaXN0ZW5lcik7Ci0KLQkJCQkJCXdoaWxlIChjb21wbGV0aW9uU3RhdHVzID09IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltdXRleC53YWl0KCk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gSWYgZm9yY2VkLCBvciB0aGVyZSB3YXMgYW4gZXJyb3IgKGRvZXNuJ3QgaW5jbHVkZSB0aW1lb3V0KSwgb3Igd2UgYXJlIHN0b3BwZWQsIHRpbWUgdG8gZXhpdAotCQkJCQlpZiAoZm9yY2UgfHwgIWNvbXBsZXRpb25TdGF0dXMuaXNPSygpIHx8IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3JjZSA9IFRvbWNhdFVJUGx1Z2luLnF1ZXJ5Q2xlYW5UZXJtaW5hdGlvbihzZXJ2ZXIpOwotCQkJCQkJY29tcGxldGlvblN0YXR1cyA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkKLQkJCQlpZiAoIWNvbXBsZXRpb25TdGF0dXMuaXNPSygpKSB7Ci0JCQkJCS8vIElmIHN0b3Agam9iIGZhaWxlZCwgYXNzdW1lIGVycm9yIHdhcyBkaXNwbGF5ZWQgZm9yIHRoYXQgam9iCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCXJldHVybiBuZXdFcnJvclN0YXR1cygKLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90Q2xlYW5TdG9wRmFpbGVkLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQkJfQotCQkJCXJlc3RhcnQgPSB0cnVlOwotCQkJCWNvbXBsZXRpb25TdGF0dXMgPSBudWxsOwotCQkJfQotCQkJCi0JCQlEZWxldGVXb3JrRGlySm9iIGRlbGV0ZUpvYiA9IG5ldyBEZWxldGVXb3JrRGlySm9iKGdldE5hbWUoKSwgd2ViTW9kdWxlLCByZXN0YXJ0KTsKLQkJCWRlbGV0ZUpvYi5zZXRSdWxlKFNlcnZlclV0aWwuZ2V0U2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKSk7Ci0KLQkJCWRlbGV0ZUpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQljb21wbGV0aW9uU3RhdHVzID0gZXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSk7Ci0KLQkJCS8vIFBlcmZvcm0gdGhlIHdvcmsgZGlyZWN0b3J5IGRlbGV0aW9uIGpvYgotCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCWRlbGV0ZUpvYi5zY2hlZHVsZSgpOwotCi0JCQkJd2hpbGUgKGNvbXBsZXRpb25TdGF0dXMgPT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghY29tcGxldGlvblN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBJZiBkZWxldGUgam9iIGZhaWxlZCwgYXNzdW1lIGVycm9yIHdhcyBkaXNwbGF5ZWQgZm9yIHRoYXQgam9iCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQljb21wbGV0aW9uU3RhdHVzID0gbnVsbDsKLQotCQkJaWYgKHJlc3RhcnQpIHsKLQkJCQlzdGF0dXMgPSBzZXJ2ZXIuY2FuU3RhcnQobW9kZSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiB3cmFwRXJyb3JTdGF0dXMoc3RhdHVzLCAKLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNsZWFuQ2FudFJlc3RhcnQsIHNlcnZlci5nZXROYW1lKCkpKTsKLQkJCQl9Ci0KLQkJCQkvLyBSZXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24KLQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCXNlcnZlci5zdGFydChtb2RlLCBsaXN0ZW5lcik7Ci0KLQkJCQkJd2hpbGUgKGNvbXBsZXRpb25TdGF0dXMgPT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltdXRleC53YWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gSWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFjb21wbGV0aW9uU3RhdHVzLmlzT0soKSkgewotCQkJCQkvLyBJZiBzdGFydCBqb2IgZmFpbGVkLCBhc3N1bWUgZXJyb3Igd2FzIGRpc3BsYXllZCBmb3IgdGhhdCBqb2IKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEpvYiB0byBhY3R1YWxseSBkZWxldGUgdGhlIHdvcmsgZGlyZWN0b3J5LiAgVGhpcyBpcyBkb25lCi0JICogaW4gYSBzZXBhcmF0ZSBqb2Igc28gaXQgY2FuIGJlIGEgInNpYmxpbmciIG9mIHBvdGVudGlhbAotCSAqIHN0b3AgYW5kIHN0YXJ0IGpvYnMuIFRoaXMgYWxsb3dzIGl0IHRvIGhhdmUgYSBzZXJ2ZXIKLQkgKiBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JY2xhc3MgRGVsZXRlV29ya0RpckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgSVdlYk1vZHVsZSB3ZWJNb2R1bGU7Ci0JCXByaXZhdGUgYm9vbGVhbiByZXN0YXJ0OwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBuYW1lIG5hbWUgZm9yIGpvYgotCQkgKi8KLQkJcHVibGljIERlbGV0ZVdvcmtEaXJKb2IoU3RyaW5nIGpvYk5hbWUsIElXZWJNb2R1bGUgd2ViTW9kdWxlLCBib29sZWFuIHJlc3RhcnQpIHsKLQkJCXN1cGVyKGpvYk5hbWUpOwotCQkJdGhpcy53ZWJNb2R1bGUgPSB3ZWJNb2R1bGU7Ci0JCQl0aGlzLnJlc3RhcnQgPSByZXN0YXJ0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSm9iI2JlbG9uZ3NUbyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkuZXF1YWxzKGZhbWlseSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCS8vIElmIHNlcnZlciBpc24ndCBzdG9wcGVkLCBhYm9ydCB0aGUgYXR0ZW1wdCB0byBkZWxldGUgdGhlIHdvcmsgZGlyZWN0b3J5Ci0JCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKAotCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDYW50RGVsZXRlU2VydmVyTm90U3RvcHBlZCwgCi0JCQkJCQkJCXdlYk1vZHVsZSAhPSBudWxsID8gbW9kdWxlLmdldE5hbWUoKSA6IHNlcnZlci5nZXROYW1lKCkpLCBudWxsKTsKLQkJCX0JCQkJCi0KLQkJCS8vIERlbGV0ZSB0aGUgd29yayBkaXJlY3RvcnkKLQkJCVRvbWNhdFNlcnZlckJlaGF2aW91ciB0c2IgPSAoVG9tY2F0U2VydmVyQmVoYXZpb3VyKXNlcnZlci5sb2FkQWRhcHRlcigKLQkJCQkJVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBtb25pdG9yKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlUb21jYXRXZWJNb2R1bGUgdGNXZWJNb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpLCAiIiwgIiIsIHRydWUpOwotCQkJCQlzdGF0dXMgPSB0c2IuY2xlYW5Db250ZXh0V29ya0Rpcih0Y1dlYk1vZHVsZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdGF0dXMgPSB0c2IuY2xlYW5TZXJ2ZXJXb3JrRGlyKG51bGwpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyBjbGVhbk5hbWUgPSBtb2R1bGUgIT0gbnVsbCA/IG1vZHVsZS5nZXROYW1lKCkgOiBzZXJ2ZXIuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB3cmFwRXJyb3JTdGF0dXMoc3RhdHVzLAotCQkJCQkJcmVzdGFydCA/Ci0JCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRXJyb3JEdXJpbmdDbGVhbldhc1J1bm5pbmcsIAotCQkJCQkJCQkJCWNsZWFuTmFtZSAsIHNlcnZlci5nZXROYW1lKCkpIDoKLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JFcnJvckR1cmluZ0NsZWFuLCBjbGVhbk5hbWUpKTsKLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNhcHR1cmVTZXJ2ZXJTdGF0ZSgpIHsKLQkJc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBuZXdFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJbWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgd3JhcEVycm9yU3RhdHVzKElTdGF0dXMgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgewotCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIG51bGwpOwotCQltcy5hZGQoc3RhdHVzKTsKLQkJcmV0dXJuIG1zOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db25maWd1cmF0aW9uUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyYjJkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JUHJvcGVydHlUZXN0ZXIjdGVzdChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgcmVjZWl2ZXI7Ci0JCQlUb21jYXRTZXJ2ZXIgdG9tY2F0U2VydmVyID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKElUb21jYXRTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQkJaWYgKHRvbWNhdFNlcnZlciAhPSBudWxsKQotCQkJCXJldHVybiB0b21jYXRTZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpICE9IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjA2MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0vKioKLSAqIENvbnN0YW50IGlkcyBmb3IgY29udGV4dCBoZWxwLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FRElUT1IgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1RFU1RfRU5WSVJPTk1FTlQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1NFQ1VSRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVpZzAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FRElUT1JfREVCVUdfTU9ERSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVpZzAwMDYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFUyA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfTElTVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfQUREX1BST0pFQ1QgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9FWFRFUk5BTCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfRURJVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfUkVNT1ZFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWN3MDAxMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVfRElBTE9HID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHdtMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QUk9KRUNUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QQVRIID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19ET0NCQVNFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19SRUxPQUQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRkcHIwMDA4IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNtMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfTElTVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjbTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX0FERCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjbTAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX0VESVQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19SRU1PVkUgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDA4IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdfRElBTE9HID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZG1tMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR19ESUFMT0dfVFlQRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRtbTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdfRElBTE9HX0VYVEVOU0lPTiA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRtbTAwMDQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfUE9SVFMgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUU19MSVNUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNwMDAwMiI7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfQ09NUE9TSVRFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50d25yMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ0xFQU5fV09SS19ESVIgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnR2Y3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ0xFQU5fV09SS19ESVJfVEVSTUlOQVRFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50dmNwMDAwMSI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbnRleHRQdWJsaXNoZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0UHVibGlzaGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3ZTUxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbnRleHRQdWJsaXNoZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFB1Ymxpc2hlckRlbGVnYXRlIGV4dGVuZHMgUHVibGlzaGVyRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUVVBTElGSUVEX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZShUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsICJjb250ZXh0Um9vdCIpOwotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gdGhpcyBwdWJsaXNoZXIgb25seSBydW5zIHdoZW4gdGhlcmUgaXMgYSBVSQotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IChTaGVsbCkgaW5mby5nZXRBZGFwdGVyKFNoZWxsLmNsYXNzKTsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQlUb21jYXRTZXJ2ZXIgdG9tY2F0U2VydmVyID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcywgbW9uaXRvcik7Ci0JCWZpbmFsIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHRvbWNhdFNlcnZlci5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCQotCQlmaW5hbCBib29sZWFuW10gc2F2ZSA9IG5ldyBib29sZWFuWzFdOwotCQlMaXN0IG1vZHVsZXMgPSAoTGlzdCkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZXMuZ2V0KGkpOwotCQkJZmluYWwgSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpIG0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7Ci0JCQlmaW5hbCBXZWJNb2R1bGUgd2ViTW9kdWxlMiA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlKG0pOwotCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsICYmIHdlYk1vZHVsZTIgIT0gbnVsbCkgewotCQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCWlmIChjb250ZXh0Um9vdCAhPSBudWxsICYmICFjb250ZXh0Um9vdC5zdGFydHNXaXRoKCIvIikgJiYgY29udGV4dFJvb3QubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0Um9vdCA9ICIvIiArIGNvbnRleHRSb290OwotCQkJCQotCQkJCWlmICghY29udGV4dFJvb3QuZXF1YWxzKHdlYk1vZHVsZTIuZ2V0UGF0aCgpKSAmJiBzaG91bGRQcm9tcHQobSwgY29udGV4dFJvb3QpKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBjb250ZXh0ID0gY29udGV4dFJvb3Q7Ci0JCQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCBNZXNzYWdlcy53aXphcmRUaXRsZSwgTkxTLmJpbmQoTWVzc2FnZXMuY29udGV4dENsZWFudXAsIG0uZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCQkJaW50IGluZGV4ID0gY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuaW5kZXhPZih3ZWJNb2R1bGUyKTsKLQkJCQkJCQkJY29uZmlndXJhdGlvbi5tb2RpZnlXZWJNb2R1bGUoaW5kZXgsIHdlYk1vZHVsZTIuZ2V0RG9jdW1lbnRCYXNlKCksIGNvbnRleHQsIHdlYk1vZHVsZTIuaXNSZWxvYWRhYmxlKCkpOwotCQkJCQkJCQlzYXZlWzBdID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQltYXJrUHJvamVjdChtLCBjb250ZXh0Um9vdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzYXZlWzBdKQotCQkJdG9tY2F0U2VydmVyLnNhdmVDb25maWd1cmF0aW9uKG1vbml0b3IpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUHJvbXB0KElNb2R1bGUgbSwgU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBtLmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoUVVBTElGSUVEX05BTUUpOwotCQkJaWYgKHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiAhY29udGV4dFJvb3QuZXF1YWxzKHMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQcm9qZWN0KElNb2R1bGUgbSwgU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBtLmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShRVUFMSUZJRURfTkFNRSwgY29udGV4dFJvb3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUsIGl0J3Mgb2sgdG8gcHJvbXB0IGFnYWluIGxhdGVyCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzRkOGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6YXJkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbERpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RJbnN0YWxsRGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxlZEpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsZWRKUkVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVEZWZhdWx0SlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvckFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JFZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JCcm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JNaXNzaW5nV2ViTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUG9ydHNTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0TmFtZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUG9ydFZhbHVlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzUGFnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQYXRoQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JEb2NCYXNlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQcm9qZWN0Q29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFkZFByb2plY3RNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQcm9qZWN0TWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkRGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nVGl0bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ01pbWVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckxvY2F0aW9uc1NlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yTG9jYXRpb25zRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yTG9jYXRpb25zRGVzY3JpcHRpb24yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckdlbmVyYWxTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckdlbmVyYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJNZXRhZGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJJbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlcnZlckRpckN1c3RvbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXRJbnRlcm5hbFNlcnZlckRpckxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yU2V0SW50ZXJuYWxTZXJ2ZXJEaXJMaW5rMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXRJbnN0YWxsU2VydmVyRGlyTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXRJbnN0YWxsU2VydmVyRGlyTGluazI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmsyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlcnZlckRpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JEZXBsb3lEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck5vUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXBhcmF0ZUNvbnRleHRGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZWN1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yRGVidWdNb2RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck5vdFN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JEb2VzTm90TW9kaWZ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclRha2VzQ29udHJvbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNlcnZlck11c3RCZVN0b3BwZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTZXJ2ZXJEaXJJc1Jvb3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTZXJ2ZXJEaXJVbmRlclJvb3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RNZXRhZGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNlcnZlckRpckN1c3RvbU5vdEluc3RhbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZXBsb3lEaXJOb3RTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQnJvd3NlU2VydmVyTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JCcm93c2VEZXBsb3lNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dQcm9qZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nRG9jdW1lbnRCYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dTZWxlY3REaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWZhdWx0RGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybUNsZWFuV29ya0RpclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuU2VydmVyU3RhdGVDaGFuZ2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhbk1vZHVsZVdvcmtEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5TZXJ2ZXJXb3JrRGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuU2VydmVyUnVubmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhblNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENsZWFuU3RhdGVDaGFuZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENsZWFuQ2FudFN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENsZWFuU3RvcEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNhbnRJZGVudGlmeVdlYkFwcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNhbnREZWxldGVTZXJ2ZXJOb3RTdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRXJyb3JEdXJpbmdDbGVhbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckVycm9yRHVyaW5nQ2xlYW5XYXNSdW5uaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ2xlYW5DYW50UmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZXh0Q2xlYW51cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhblRlcm1pbmF0ZVNlcnZlckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjUzOWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgVUkgLS0tLS0tLS0tLS0tLS0tCi0KLXJ1bnRpbWVOYW1lPU5hJm1lOgotYnJvd3NlPUImcm93c2UuLi4KLWluc3RhbGw9RG93bmxvYWQgYW5kIEluc3RhbGwuLi4KLWluc3RhbGxEaXI9VG9tY2F0IGluc3RhbGxhdGlvbiAmZGlyZWN0b3J5OgotaW5zdGFsbGVkSlJFPSZKUkU6Ci1pbnN0YWxsZWRKUkVzPSZJbnN0YWxsZWQgSlJFcy4uLgotc2VsZWN0SW5zdGFsbERpcj1TZWxlY3QgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi1ydW50aW1lRGVmYXVsdEpSRT1Xb3JrYmVuY2ggZGVmYXVsdCBKUkUKLWNvbnRleHRDbGVhbnVwPVRoZSBjb250ZXh0IHJvb3Qgb2YgbW9kdWxlIHswfSBoYXMgYmVlbiBtb2RpZmllZC4gRG8geW91IHdhbnQgdG8gdXBkYXRlIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0byBtYXRjaD8KLQotIyBOZXcgVG9tY2F0IHNlcnZlciB3aXphcmQKLXdpemFyZFRpdGxlPVRvbWNhdCBTZXJ2ZXIKLXdpemFyZERlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKLQotIyAtLS0tLS0tLS0tLS0tLS0gRWRpdG9ycyAtLS0tLS0tLS0tLS0tLS0KLQotIyBHZW5lcmFsIHRleHQgdXNlZCBpbiBib3RoIGVkaXRvcnMKLWVkaXRvclJlbW92ZT1SZW1vdmUKLWVkaXRvckFkZD1BZGQuLi4KLWVkaXRvckVkaXQ9RWRpdC4uLgotZWRpdG9yQnJvd3NlPUJyb3dzZS4uLgotCi0jIC0tLSBDb25maWd1cmF0aW9uIEVkaXRvciAtLS0KLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzUGFnZVRpdGxlPVdlYiBNb2R1bGVzCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1NlY3Rpb249V2ViIE1vZHVsZXMKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzRGVzY3JpcHRpb249Q29uZmlndXJlIHRoZSBXZWIgTW9kdWxlcyBvbiB0aGlzIHNlcnZlci4KLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NTZWN0aW9uPU1JTUUgTWFwcGluZ3MKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NEZXNjcmlwdGlvbj1Db25maWd1cmUgTUlNRSB0eXBlIG1hcHBpbmdzLgotY29uZmlndXJhdGlvbkVkaXRvclBvcnRzU2VjdGlvbj1Qb3J0cwotY29uZmlndXJhdGlvbkVkaXRvclBvcnRzRGVzY3JpcHRpb249TW9kaWZ5IHRoZSBzZXJ2ZXIgcG9ydHMuCi0KLSMgRmllbGRzCi1jb25maWd1cmF0aW9uRWRpdG9yUG9ydE5hbWVDb2x1bW49UG9ydCBOYW1lCi1jb25maWd1cmF0aW9uRWRpdG9yUG9ydFZhbHVlQ29sdW1uPVBvcnQgTnVtYmVyCi1jb25maWd1cmF0aW9uRWRpdG9yUGF0aENvbHVtbj1QYXRoCi1jb25maWd1cmF0aW9uRWRpdG9yRG9jQmFzZUNvbHVtbj1Eb2N1bWVudCBCYXNlCi1jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdENvbHVtbj1Nb2R1bGUKLWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW49QXV0byBSZWxvYWQKLWNvbmZpZ3VyYXRpb25FZGl0b3JQcm9qZWN0TWlzc2luZz17MH0gbWlzc2luZwotY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZEVuYWJsZWQ9RW5hYmxlZAotY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZERpc2FibGVkPURpc2FibGVkCi1jb25maWd1cmF0aW9uRWRpdG9yQWRkUHJvamVjdE1vZHVsZT1BZGQgV2ViIE1vZHVsZS4uLgotY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlPUFkZCBFeHRlcm5hbCBXZWIgTW9kdWxlLi4uCi0KLSMgQWRkL0VkaXQgTWltZSBNYXBwaW5nIGRpYWxvZwotY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlRWRpdD1FZGl0IE1JTUUgTWFwcGluZwotY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlQWRkPUFkZCBNSU1FIE1hcHBpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lVHlwZT1NSU1FICZ0eXBlOgotY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ01pbWVFeHRlbnNpb249TUlNRSAmZXh0ZW5zaW9uOgotCi0jIEFkZC9FZGl0IFdlYiBNb2R1bGUgZGlhbG9nCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nVGl0bGVFZGl0PUVkaXQgV2ViIE1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlQWRkPUFkZCBXZWIgTW9kdWxlCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUHJvamVjdHM9Jk1vZHVsZXM6Ci1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aD1QJmF0aDoKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dEb2N1bWVudEJhc2U9JkRvY3VtZW50IGJhc2U6Ci1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUmVsb2FkRW5hYmxlZD1BdXRvIHImZWxvYWRpbmcgZW5hYmxlZAotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeT1TZWxlY3QgdGhlIFdlYiBtb2R1bGUgZGlyZWN0b3J5LgotZXJyb3JNaXNzaW5nV2ViTW9kdWxlPVRoZSBXZWIgbW9kdWxlIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb24gY2Fubm90IGJlIGZvdW5kOiB7MH0uCi0KLSMgLS0tIFNlcnZlciBFZGl0b3IgLS0tCi1zZXJ2ZXJFZGl0b3JMb2NhdGlvbnNTZWN0aW9uPVNlcnZlciBMb2NhdGlvbnMKLXNlcnZlckVkaXRvckxvY2F0aW9uc0Rlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHNlcnZlciBhbmQgZGVwbG95IHBhdGhzLiBTZXJ2ZXIgbXVzdCBiZSBwdWJsaXNoZWQgd2l0aCBubyBtb2R1bGVzIHByZXNlbnQgdG8gbWFrZSBjaGFuZ2VzLgotc2VydmVyRWRpdG9yTG9jYXRpb25zRGVzY3JpcHRpb24yPVNwZWNpZnkgdGhlIHNlcnZlciBwYXRoIChpLmUuIGNhdGFsaW5hLmJhc2UpIGFuZCBkZXBsb3kgcGF0aC4gU2VydmVyIG11c3QgYmUgcHVibGlzaGVkIHdpdGggbm8gbW9kdWxlcyBwcmVzZW50IHRvIG1ha2UgY2hhbmdlcy4KLXNlcnZlckVkaXRvckdlbmVyYWxTZWN0aW9uPVNlcnZlciBPcHRpb25zCi1zZXJ2ZXJFZGl0b3JHZW5lcmFsRGVzY3JpcHRpb249RW50ZXIgc2V0dGluZ3MgZm9yIHRoZSBzZXJ2ZXIuCi0KLSMgTGluayBGaWVsZHMgCi1zZXJ2ZXJFZGl0b3JTZXRJbnRlcm5hbFNlcnZlckRpckxpbms9U2V0IHNlcnZlciBwYXRoIHRvIGludGVybmFsbHkgc3VwcGxpZWQgbG9jYXRpb24KLXNlcnZlckVkaXRvclNldEludGVybmFsU2VydmVyRGlyTGluazI9U2V0IHNlcnZlciBwYXRoIHRvIGludGVybmFsbHkgc3VwcGxpZWQgbG9jYXRpb24gKGN1cnJlbnRseSBzZXQpCi1zZXJ2ZXJFZGl0b3JTZXRJbnN0YWxsU2VydmVyRGlyTGluaz1TZXQgc2VydmVyIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uCi1zZXJ2ZXJFZGl0b3JTZXRJbnN0YWxsU2VydmVyRGlyTGluazI9U2V0IHNlcnZlciBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbiAoY3VycmVudGx5IHNldCkKLXNlcnZlckVkaXRvclNldERlZmF1bHREZXBsb3lEaXJMaW5rPVNldCBkZXBsb3kgcGF0aCB0byB0aGUgZGVmYXVsdCB2YWx1ZQotc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmsyPVNldCBkZXBsb3kgcGF0aCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAoY3VycmVudGx5IHNldCkKLQotIyBGaWVsZHMKLSMgTm90ZTogVGhlIGFyZ3VtZW50IGZvciB0aGUgZm9sbG93aW5nIHRocmVlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc3RyaW5nIGZvcgotIyAgICAgICBvbmUgb2Ygc2VydmVyRWRpdG9yRG9lc05vdE1vZGlmeSBvciBzZXJ2ZXJFZGl0b3JUYWtlc0NvbnRyb2wgb3IgYW5kIGVtcHR5IHN0cmluZy4KLXNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhPVVzZSB3b3Jrc3BhY2UgbWV0YWRhdGEgezB9Ci1zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJJbnN0YWxsPVVzZSBUb21jYXQgaW5zdGFsbGF0aW9uIHswfQotc2VydmVyRWRpdG9yU2VydmVyRGlyQ3VzdG9tPVVzZSBjdXN0b20gbG9jYXRpb24gezB9Ci1zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXI9U2VydmVyIHBhdGg6Ci1zZXJ2ZXJFZGl0b3JEZXBsb3lEaXI9RGVwbG95IHBhdGg6Ci1zZXJ2ZXJFZGl0b3JTZWN1cmU9RW5hYmxlIHNlY3VyaXR5Ci0jIE5vdGU6IFRoZSBhcmd1bWVudCBmb3IgdGhlIGZvbGxvd2luZyBzdHJpbmcgd2lsbCBiZSB0aGUgc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkIHN0cmluZyBvciBhbiBlbXB0eSBzdHJpbmcKLXNlcnZlckVkaXRvckRlYnVnTW9kZT1FbmFibGUgVG9tY2F0IGRlYnVnIGxvZ2dpbmcgezB9Ci1zZXJ2ZXJFZGl0b3JUZXN0RW52aXJvbm1lbnQ9UnVuIG1vZHVsZXMgZGlyZWN0bHkgZnJvbSB0aGUgd29ya3NwYWNlIChkbyBub3QgbW9kaWZ5IHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uKQotIyBOb3RlOiBUaGUgYXJndW1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHdpbGwgYmUgdGhlIHNlcnZlckVkaXRvck5vdFN1cHBvcnRlZCBzdHJpbmcgb3IgYW4gZW1wdHkgc3RyaW5nCi1zZXJ2ZXJFZGl0b3JOb1B1Ymxpc2g9U2VydmUgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcgezB9Ci1zZXJ2ZXJFZGl0b3JTZXBhcmF0ZUNvbnRleHRGaWxlcz1QdWJsaXNoIG1vZHVsZSBjb250ZXh0cyB0byBzZXBhcmF0ZSBYTUwgZmlsZXMgezB9Ci1lcnJvclNlcnZlckRpcklzUm9vdD1UaGUgc2VydmVyIHBhdGggbWF5IG5vdCBiZSBzZXQgdG8gdGhlIHRoZSByb290IG9mIHlvdXIgd29ya3NwYWNlLgotZXJyb3JTZXJ2ZXJEaXJVbmRlclJvb3Q9VGhlIHNlcnZlciBwYXRoIG1heSBub3QgYmUgdW5kZXIgdGhlIFwiezB9XCIgZm9sZGVyIG9mIHlvdXIgd29ya3NwYWNlIHVubGVzcyBpdCBpcyB0aGUgd29ya3NwYWNlIG1ldGFkYXRhIGxvY2F0aW9uLgotIyBOb3RlOiBUaGUgYXJndW1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHdpbGwgYmUgdGhlIHN0cmluZyBmb3Igc2VydmVyRWRpdG9yU2VydmVyRGlyTWV0YWRhdGEgd2l0aCBhIGJsYW5rIHN0cmluZyBmb3IgaXRzIGFyZ3VtZW50Ci1lcnJvclNlcnZlckRpckN1c3RvbU5vdE1ldGFkYXRhPU9ubHkgdGhlIFwiezB9XCIgc2VsZWN0aW9uIG1heSBzZXQgdGhlIHNlcnZlciBwYXRoIHRvIHRoZSB3b3Jrc3BhY2UgbWV0YWRhdGEgbG9jYXRpb24uCi0jIE5vdGU6IFRoZSBhcmd1bWVudCBmb3IgdGhlIGZvbGxvd2luZyBzdHJpbmcgd2lsbCBiZSB0aGUgc3RyaW5nIGZvciBzZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJJbnN0YWxsIHdpdGggYSBibGFuayBzdHJpbmcgZm9yIGl0cyBhcmd1bWVudAotZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RJbnN0YWxsPU9ubHkgdGhlIFwiezB9XCIgc2VsZWN0aW9uIG1heSBzZXQgdGhlIHNlcnZlciBwYXRoIHRvIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uLgotZXJyb3JEZXBsb3lEaXJOb3RTcGVjaWZpZWQ9QSBkZXBsb3kgcGF0aCBtdXN0IGJlIHNwZWNpZmllZC4KLXNlcnZlckVkaXRvck5vdFN1cHBvcnRlZD0obm90IHN1cHBvcnRlZCBieSB0aGlzIFRvbWNhdCB2ZXJzaW9uKQotc2VydmVyRWRpdG9yRG9lc05vdE1vZGlmeT0oZG9lcyBub3QgbW9kaWZ5IFRvbWNhdCBpbnN0YWxsYXRpb24pCi1zZXJ2ZXJFZGl0b3JUYWtlc0NvbnRyb2w9KHRha2VzIGNvbnRyb2wgb2YgVG9tY2F0IGluc3RhbGxhdGlvbikKLWVycm9yU2VydmVyTXVzdEJlU3RvcHBlZD1UaGUgc2VydmVyIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgYSBjaGFuZ2UgdG8gdGhlIFwiezB9XCIgc2V0dGluZyBjYW4gYmUgc2F2ZWQuCi0KLSMgQnJvd3NlIGZvciBTZXJ2ZXIgZGlhbG9nCi1zZXJ2ZXJFZGl0b3JCcm93c2VTZXJ2ZXJNZXNzYWdlPVNlbGVjdCBhIHNlcnZlciBkaXJlY3RvcnkuCi0KLSMgQnJvd3NlIGZvciBEZXBsb3kgZGlhbG9nCi1zZXJ2ZXJFZGl0b3JCcm93c2VEZXBsb3lNZXNzYWdlPVNlbGVjdCBhIGRlcGxveSBkaXJlY3RvcnkuCi0KLSMgLS0tIENsZWFuIFdvcmsgRGlyZWN0b3J5IC0tLQotY29uZmlybUNsZWFuV29ya0RpclRpdGxlPUNvbmZpcm0gQ2xlYW4gV29yayBEaXJlY3RvcnkKLWNsZWFuU2VydmVyU3RhdGVDaGFuZ2luZz1UaGUgc3RhdGUgb2YgezB9IGlzIGluIHRyYW5zaXRpb24gb3IgdW5rbm93bi4gIFRyeSBhZ2FpbiB3aGVuIHRoZSBzZXJ2ZXIgaGFzIHJlYWNoZWQgYSBzdGFibGUgc3RhdGUuCi1jbGVhbk1vZHVsZVdvcmtEaXI9Q2xlYW4gd29yayBkaXJlY3RvcnkgZm9yIG1vZHVsZSB7MH0gb24gezF9LgotY2xlYW5TZXJ2ZXJXb3JrRGlyPUNsZWFuIHdvcmsgZGlyZWN0b3JpZXMgZm9yIGFsbCBXZWIgYXBwbGljYXRpb25zIG9uIHswfS4KLWNsZWFuU2VydmVyUnVubmluZz1UaGUgc2VydmVyIG11c3QgYmUgc3RvcHBlZCB0byBjbGVhbiB0aGUgd29yayBkaXJlY3RvcnkuICBDbGlja2luZyBPSyB3aWxsIGluY2x1ZGUgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgdGhlIHNlcnZlci4KLWNsZWFuU2VydmVyVGFzaz1DbGVhbmluZyB7MH0gd29yayBkaXJlY3RvcnkKLQotIyAtLS0gRXJyb3IgU3RyaW5ncyAtLS0KLWVycm9yRGVmYXVsdERpYWxvZ1RpdGxlPVRvbWNhdCBTZXJ2ZXIgRXJyb3IKLQotIyAtLS0gQ2xlYW4gV29yayBEaXJlY3RvcnkgRXJyb3JzIC0tLQotZXJyb3JDb3VsZE5vdENsZWFuU3RhdGVDaGFuZ2U9Q2xlYW4gb3BlcmF0aW9uIHdhcyBhYm9ydGVkIGJlY2F1c2UgezB9IGluZGVwZW5kZW50bHkgY2hhbmdlZCBzdGF0ZSBhZnRlciBjb25maXJtYXRpb24gZGlhbG9nIHdhcyBkaXNwbGF5ZWQuICBUcnkgYWdhaW4gb25jZSB0aGUgc2VydmVyIGhhcyByZWFjaGVkIGEgc3RhYmxlIHN0YXRlLgotZXJyb3JDb3VsZE5vdENsZWFuQ2FudFN0b3A9ezB9IGNhbiBub3QgYmUgc3RvcHBlZCBhdCB0aGlzIHRpbWUuICBUcnkgYWdhaW4gd2hlbiB0aGUgc2VydmVyIGlzIHN0b3BwZWQgb3IgY2FuIGJlIHN0b3BwZWQuCi1lcnJvckNvdWxkTm90Q2xlYW5TdG9wRmFpbGVkPXswfSBmYWlsZWQgdG8gc3RvcC4gIFRyeSBhZ2FpbiB3aGVuIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCBvciBjYW4gYmUgc3RvcHBlZC4KLQotZXJyb3JDYW50SWRlbnRpZnlXZWJBcHA9TW9kdWxlIHswfSBjb3VsZCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgV2ViIGFwcGxpY2F0aW9uIG9uIGEgc2VydmVyLgotZXJyb3JDYW50RGVsZXRlU2VydmVyTm90U3RvcHBlZD17MH0gd29yayBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQuICBTZXJ2ZXIgd2FzIG5vdCBzdG9wcGVkLiAgVHJ5IGFnYWluIHdoZW4gdGhlIHNlcnZlciBpcyBzdG9wcGVkIG9yIGNhbiBiZSBzdG9wcGVkLgotZXJyb3JFcnJvckR1cmluZ0NsZWFuPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNsZWFuaW5nIHswfSB3b3JrIGRpcmVjdG9yeS4KLWVycm9yRXJyb3JEdXJpbmdDbGVhbldhc1J1bm5pbmc9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2xlYW5pbmcgezB9IHdvcmsgZGlyZWN0b3J5LiAgezF9IHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkLgotCi1lcnJvckNsZWFuQ2FudFJlc3RhcnQ9ezB9IGlzIHVuYWJsZSB0byByZXN0YXJ0IGF0IHRoaXMgdGltZS4KLQotIyBUZXJtaW5hdGUgU2VydmVyIGRpYWxvZwotY2xlYW5UZXJtaW5hdGVTZXJ2ZXJEaWFsb2dUaXRsZT1DbGVhbiBXb3JrIERpcmVjdG9yeSBUZXJtaW5hdGUgU2VydmVyCi1jbGVhblRlcm1pbmF0ZVNlcnZlckRpYWxvZ01lc3NhZ2U9ezB9IGhhcyBub3QgZmluaXNoZWQgc3RvcHBpbmcgd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZC4gRG8geW91IHdhbnQgdG8gdGVybWluYXRlIHRoaXMgc2VydmVyIGltbWVkaWF0ZWx5PyBDbGljayBPSyB0byB0ZXJtaW5hdGUgdGhlIHNlcnZlciBvciBjbGljayBDYW5jZWwgdG8gY29udGludWUgd2FpdGluZy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTAzYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCB0aGUgY29tcG9uZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvCi0JICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKLQkgKiBAcmV0dXJuIGEgYnV0dG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KGxhYmVsKTsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYik7Ci0JCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVmYjZjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1Rlcm1pbmF0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qKgotICogRGlhbG9nIHRoYXQgcHJvbXB0cyBhIHVzZXIgdG8gc2VlIGlmIGEgc2VydmVyIHNob3VsZAotICogYmUgdGVybWluYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFRlcm1pbmF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQotCS8qKgotCSAqIFRlcm1pbmF0aW9uRGlhbG9nIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIHRpdGxlIG9mIGRpYWxvZwotCSAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXB1YmxpYyBUZXJtaW5hdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBDb250ZXh0SWRzLlNFUlZFUl9DTEVBTl9XT1JLX0RJUl9URVJNSU5BVEUpOwotCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IDQwMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmY3MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFBcmd1bWVudHNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFDbGFzc3BhdGhUYWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci0vKioKLSAqIEEgZGVidWcgdGFiIGdyb3VwIGZvciBsYXVuY2hpbmcgVG9tY2F0LiAKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIHsKLQkvKgotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCNjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKSB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9IG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYls2XTsKLQkJdGFic1swXSA9IG5ldyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKG5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIgfSk7Ci0JCXRhYnNbMF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzFdID0gbmV3IEphdmFBcmd1bWVudHNUYWIoKTsKLQkJdGFic1sxXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMl0gPSBuZXcgSmF2YUNsYXNzcGF0aFRhYigpOwotCQl0YWJzWzJdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1szXSA9IG5ldyBTb3VyY2VMb29rdXBUYWIoKTsKLQkJdGFic1szXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNF0gPSBuZXcgRW52aXJvbm1lbnRUYWIoKTsKLQkJdGFic1s0XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNV0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU2NzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUluc3RhbGxhYmxlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTGljZW5zZVdpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIFdpemFyZCBwYWdlIHRvIHNldCB0aGUgc2VydmVyIGluc3RhbGwgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDOwotCXByb3RlY3RlZCBJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWU7Ci0JCi0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCQotCXByb3RlY3RlZCBUZXh0IGluc3RhbGxEaXI7Ci0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JcHJvdGVjdGVkIExpc3QgaW5zdGFsbGVkSlJFczsKLQlwcm90ZWN0ZWQgU3RyaW5nW10ganJlTmFtZXM7Ci0JcHJvdGVjdGVkIElJbnN0YWxsYWJsZVJ1bnRpbWUgaXI7Ci0JcHJvdGVjdGVkIExhYmVsIGluc3RhbGxMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGluc3RhbGw7Ci0KLQkvKioKLQkgKiBUb21jYXRSdW50aW1lV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIHRoZSB3aXphcmQgaGFuZGxlCi0JICovCi0JcHJvdGVjdGVkIFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpemFyZFRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpemFyZERlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihUb21jYXRVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoVG9tY2F0VUlQbHVnaW4uSU1HX1dJWl9UT01DQVQpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5KSBuZXdSdW50aW1lLmxvYWRBZGFwdGVyKElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQl9Ci0JCQotCQlpZiAocnVudGltZVdDID09IG51bGwpIHsKLQkJCWlyID0gbnVsbDsKLQkJCWluc3RhbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpbnN0YWxsTGFiZWwuc2V0VGV4dCgiIik7Ci0JCX0gZWxzZSB7Ci0JCQlpciA9IFNlcnZlclBsdWdpbi5maW5kSW5zdGFsbGFibGVSdW50aW1lKHJ1bnRpbWVXQy5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJaWYgKGlyICE9IG51bGwpIHsKLQkJCQlpbnN0YWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJaW5zdGFsbExhYmVsLnNldFRleHQoaXIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJaW5pdCgpOwotCQl2YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGUgYSB3aXphcmQgcGFnZSB0byBjaGFuZ2UgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5SVU5USU1FX0NPTVBPU0lURSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZU5hbWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbmFtZSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5pbnN0YWxsRGlyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJaW5zdGFsbERpciA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWluc3RhbGxEaXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaW5zdGFsbERpci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TG9jYXRpb24obmV3IFBhdGgoaW5zdGFsbERpci5nZXRUZXh0KCkpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBicm93c2UgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCBNZXNzYWdlcy5icm93c2UpOwotCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUudGhpcy5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5zZWxlY3RJbnN0YWxsRGlyKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCQkJaW5zdGFsbERpci5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbnN0YWxsTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULlJJR0hUKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJaW5zdGFsbExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlpbnN0YWxsID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMuaW5zdGFsbCk7Ci0JCWluc3RhbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWluc3RhbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCVN0cmluZyBsaWNlbnNlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlsaWNlbnNlID0gaXIuZ2V0TGljZW5zZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBsaWNlbnNlIiwgZSk7Ci0JCQkJfQotCQkJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRSwgbGljZW5zZSk7Ci0JCQkJVGFza1dpemFyZCB3aXphcmQyID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMuaW5zdGFsbCwgbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQkJCWxpc3QuYWRkKG5ldyBMaWNlbnNlV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCX0KLQkJCQl9LCB0YXNrTW9kZWwpOwotCQkJCQotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cyID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQyKTsKLQkJCQlpZiAoZGlhbG9nMi5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCQotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUudGhpcy5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5zZWxlY3RJbnN0YWxsRGlyKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSk7Ci0JCQkJCWluc3RhbGxEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXVwZGF0ZUpSRXMoKTsKLQkJCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW5zdGFsbGVkSlJFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBudWxsOwotCQkJCWlmIChzZWwgPiAwKQotCQkJCQl2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoc2VsIC0gMSk7Ci0JCQkJCi0JCQkJcnVudGltZS5zZXRWTUluc3RhbGwodm1JbnN0YWxsKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCBNZXNzYWdlcy5pbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJbmFtZS5mb3JjZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJLy8gZ2V0IGFsbCBpbnN0YWxsZWQgSlZNcwotCQlpbnN0YWxsZWRKUkVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVk1JbnN0YWxsVHlwZVtdIHZtSW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLQkJaW50IHNpemUgPSB2bUluc3RhbGxUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGVzW2ldLmdldFZNSW5zdGFsbHMoKTsKLQkJCWludCBzaXplMiA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsc1tqXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBuYW1lcwotCQlzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IE1lc3NhZ2VzLnJ1bnRpbWVEZWZhdWx0SlJFOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpKzFdID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5WTVByZWZlcmVuY2VQYWdlIjsKLQkJCi0JCS8vIHNob3VsZCBiZSB1c2luZyB0aGUgZm9sbG93aW5nIEFQSSwgYnV0IGl0IG9ubHkgYWxsb3dzIGEgc2luZ2xlIHByZWZlcmVuY2UgcGFnZSBpbnN0YW5jZS4KLQkJLy8gc2VlIGJ1ZyAxNjgyMTEgZm9yIGRldGFpbHMKLQkJLy9QcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGlkIH0sIG51bGwpOwotCQkvL3JldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwkJCi0JCQotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZShpZCk7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaGVsbCgpLCBtYW5hZ2VyMik7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAocnVudGltZVdDLmdldE5hbWUoKSAhPSBudWxsKQotCQkJbmFtZS5zZXRUZXh0KHJ1bnRpbWVXQy5nZXROYW1lKCkpOwotCQllbHNlCi0JCQluYW1lLnNldFRleHQoIiIpOwotCQkKLQkJaWYgKHJ1bnRpbWVXQy5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQlpbnN0YWxsRGlyLnNldFRleHQocnVudGltZVdDLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJZWxzZQotCQkJaW5zdGFsbERpci5zZXRUZXh0KCIiKTsKLQkJCi0JCS8vIHNldCBzZWxlY3Rpb24KLQkJaWYgKHJ1bnRpbWUuaXNVc2luZ0RlZmF1bHRKUkUoKSkKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJZWxzZSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgc2l6ZSA9IGluc3RhbGxlZEpSRXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IChJVk1JbnN0YWxsKSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCQlpZiAodm1JbnN0YWxsLmVxdWFscyhydW50aW1lLmdldFZNSW5zdGFsbCgpKSkgewotCQkJCQljb21iby5zZWxlY3QoaSArIDEpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWVXQy52YWxpZGF0ZShudWxsKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQllbHNlCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZkMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUgY29tcDsKLQotCXB1YmxpYyBUb21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCQotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUobnVsbCk7Ci0JCXJldHVybiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS50YXNrLldpemFyZEZyYWdtZW50I2NyZWF0ZUNvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJY29tcCA9IG5ldyBUb21jYXRSdW50aW1lQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCQljb21wLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlJUGF0aCBwYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocnVudGltZS52YWxpZGF0ZShudWxsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCi0JCQlUb21jYXRQbHVnaW4uc2V0UHJlZmVyZW5jZSgibG9jYXRpb24iICsgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksIHBhdGgudG9TdHJpbmcoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0VUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhMzI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBUaGUgYWN0dWFsIFRvbWNhdCBwbHVnaW4uIEl0IGFsbG93cyB0aGUgcmVzdCBvZiB0aGUgY2xhc3NlcwotICogdG8gbG9hZCBpbWFnZXMgYW5kIGdldCBhIGhhbmRsZSB0byB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBUb21jYXRVSVBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgTWFwIGltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gYmFzZSB1cmwgZm9yIGljb25zCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09CSiA9ICJvYmoxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpfVE9NQ0FUID0gIndpelRvbWNhdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX01PRFVMRSA9ICJ3ZWJNb2R1bGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NSU1FX01BUFBJTkcgPSAibWltZU1hcHBpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NSU1FX0VYVEVOU0lPTiA9ICJtaW1lRXh0ZW5zaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUE9SVCA9ICJwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPSkVDVF9NSVNTSU5HID0gInByb2plY3RNaXNzaW5nIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVE9NQ0FUMzJfSU5TVEFMTF9ESVIgPSAidG9tY2F0MzJpbnN0YWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPTUNBVDQwX0lOU1RBTExfRElSID0gInRvbWNhdDQwaW5zdGFsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UT01DQVQ0MV9JTlNUQUxMX0RJUiA9ICJ0b21jYXQ0MWluc3RhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVE9NQ0FUNTBfSU5TVEFMTF9ESVIgPSAidG9tY2F0NTBpbnN0YWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pES19JTlNUQUxMX0RJUiA9ICJqZGtpbnN0YWxsIjsKLQotCS8qKgotCSAqIFRvbWNhdFVJUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRvbWNhdFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1dJWl9UT01DQVQsIFVSTF9XSVpCQU4gKyAidG9tY2F0X3dpei5wbmciKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19XRUJfTU9EVUxFLCBVUkxfT0JKICsgIndlYl9tb2R1bGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NSU1FX01BUFBJTkcsIFVSTF9PQkogKyAibWltZV9tYXBwaW5nLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTUlNRV9FWFRFTlNJT04sIFVSTF9PQkogKyAibWltZV9leHRlbnNpb24uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19QT1JULCBVUkxfT0JKICsgInBvcnQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19QUk9KRUNUX01JU1NJTkcsIFVSTF9PQkogKyAicHJvamVjdF9taXNzaW5nLmdpZiIpOwotCQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCWdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkJcmV0dXJuIChJbWFnZURlc2NyaXB0b3IpIGdldEluc3RhbmNlKCkuaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvbWNhdFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhIERpc3BsYXkuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNwbGF5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwkJCi0JfQkKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRpdGxlIGZvciB0aGUgZGlhbG9nIG9yIG51bGwgZm9yIGRlZmF1bHQgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBwcmltYXJ5IG1lc3NhZ2UgdG8gZGlzcGxheQotCSAqIEBwYXJhbSBzdGF0dXMgcmVhc29uIGZvciB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwKLQkJCQkJCXRpdGxlICE9IG51bGwgPyB0aXRsZSA6IE1lc3NhZ2VzLmVycm9yRGVmYXVsdERpYWxvZ1RpdGxlLAotCQkJCQkJbWVzc2FnZSwgc3RhdHVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBxdWVyeUNsZWFuVGVybWluYXRpb24oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJQ2xlYW5UZXJtaW5hdGlvblJ1bm5hYmxlIHRyID0gbmV3IENsZWFuVGVybWluYXRpb25SdW5uYWJsZShzZXJ2ZXIpOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyh0cik7Ci0JCXJldHVybiB0ci5zaG91bGRUZXJtaW5hdGUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDbGVhblRlcm1pbmF0aW9uUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCUlTZXJ2ZXIgc2VydmVyOwotCQlib29sZWFuIHRlcm1pbmF0ZTsKLQkJCi0JCUNsZWFuVGVybWluYXRpb25SdW5uYWJsZShJU2VydmVyIHNlcnZlcikgewotCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQlUZXJtaW5hdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgVGVybWluYXRpb25EaWFsb2coc2hlbGwsCi0JCQkJCU1lc3NhZ2VzLmNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGUsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQl0ZXJtaW5hdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCi0JCWJvb2xlYW4gc2hvdWxkVGVybWluYXRlKCkgewotCQkJcmV0dXJuIHRlcm1pbmF0ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBzaGVsbAotCSAqCi0JICogQHJldHVybiBTaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSIsIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdhODc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFUb21jYXRVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW5Xb3JrRGlyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW5Xb3JrRGlyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTM2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFuV29ya0RpckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNsZWFuV29ya0RpckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOwotCi0vKioKLSAqIEFjdGlvbiB0byBkZWxldGUgVG9tY2F0IHNlcnZlciB3b3JrIGRpcmVjdG9yaWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbldvcmtEaXJBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcml2YXRlIElTZXJ2ZXIgc2VsZWN0ZWRTZXJ2ZXI7Ci0JcHJpdmF0ZSBJTW9kdWxlIHNlbGVjdGVkTW9kdWxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFjdGlvbjEuCi0JICovCi0JcHVibGljIENsZWFuV29ya0RpckFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJQ2xlYW5Xb3JrRGlyRGlhbG9nIGRsZyA9IG5ldyBDbGVhbldvcmtEaXJEaWFsb2codGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgc2VsZWN0ZWRTZXJ2ZXIsIHNlbGVjdGVkTW9kdWxlKTsKLQkJZGxnLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRTZXJ2ZXIgPSBudWxsOwotCQlzZWxlY3RlZE1vZHVsZSA9IG51bGw7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlzZWxlY3RlZFNlcnZlciA9IChJU2VydmVyKW9iajsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlck1vZHVsZSkgewotCQkJCQlJU2VydmVyTW9kdWxlIHNtID0gKElTZXJ2ZXJNb2R1bGUpb2JqOwotCQkJCQlJTW9kdWxlIFtdIG1vZHVsZSA9IHNtLmdldE1vZHVsZSgpOwotCQkJCQlzZWxlY3RlZE1vZHVsZSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQkJCWlmIChzZWxlY3RlZE1vZHVsZSAhPSBudWxsKQotCQkJCQkJc2VsZWN0ZWRTZXJ2ZXIgPSBzbS5nZXRTZXJ2ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk3YjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRvbWNhdCBjb25maWd1cmF0aW9uIG1pbWUgZWRpdG9yIHNlY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0Q29uZmlndXJhdGlvbiB0b21jYXRDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgVHJlZSBtaW1lVHlwZXM7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IC0xOwotCXByb3RlY3RlZCBMaXN0IG1hcHBpbmdzOwotCXByb3RlY3RlZCBCdXR0b24gYWRkOwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdDsKLQotCS8qKgotCSAqIENvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uQUREX01BUFBJTkdfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCU1pbWVNYXBwaW5nIG1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWFkZE1pbWVNYXBwaW5nKGluLmludFZhbHVlKCksIG1hcHBpbmcpOwotCQkJCX0gZWxzZSBpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5SRU1PVkVfTUFQUElOR19QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJcmVtb3ZlTWltZU1hcHBpbmcoaW4uaW50VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLk1PRElGWV9NQVBQSU5HX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlNaW1lTWFwcGluZyBtYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQltb2RpZnlNaW1lTWFwcGluZyhpbi5pbnRWYWx1ZSgpLCBtYXBwaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRvbWNhdENvbmZpZ3VyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJCi0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCQl8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NTZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzRGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1MpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJbWltZVR5cGVzID0gdG9vbGtpdC5jcmVhdGVUcmVlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJbWltZVR5cGVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKG1pbWVUeXBlcywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19MSVNUKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgdGFibGUKLQkJbWltZVR5cGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdE1pbWVNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWFkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXRvckFkZCwgU1dULlBVU0gpOwotCQlhZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWltZU1hcHBpbmdEaWFsb2cgZGlhbG9nID0gbmV3IE1pbWVNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgZGlhbG9nLmdldE1pbWVNYXBwaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChhZGQsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfQUREKTsKLQkJCi0JCWVkaXQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0b3JFZGl0LCBTV1QuUFVTSCk7Ci0JCWVkaXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlNaW1lTWFwcGluZ0RpYWxvZyBkaWFsb2cgPSBuZXcgTWltZU1hcHBpbmdEaWFsb2coZ2V0U2hlbGwoKSwgKE1pbWVNYXBwaW5nKSB0b21jYXRDb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpLmdldChpbmRleCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgaW5kZXgsIGRpYWxvZy5nZXRNaW1lTWFwcGluZygpKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWRpdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19FRElUKTsKLQkJCi0JCXJlbW92ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXRvclJlbW92ZSwgU1dULlBVU0gpOwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm47Ci0JCQkJZXhlY3V0ZShuZXcgUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIGluZGV4KSk7Ci0JCQkJaW5kZXggPSAtMTsKLQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHJlbW92ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19SRU1PVkUpOwotCQkKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodG9tY2F0Q29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJdG9tY2F0Q29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCVRvbWNhdFNlcnZlciB0cyA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5nZXRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQl0b21jYXRDb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJYWRkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAobWltZVR5cGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJbWltZVR5cGVzLnJlbW92ZUFsbCgpOwotCQkKLQkJbWFwcGluZ3MgPSB0b21jYXRDb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpOwotCQkKLQkJLy8gc29ydCBtYXBwaW5ncwotCQlpbnQgc2l6ZSA9IG1hcHBpbmdzLnNpemUoKTsKLQkJaW50W10gbWFwID0gbmV3IGludFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQltYXBbaV0gPSBpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlNaW1lTWFwcGluZyBtYXBwaW5nQSA9IChNaW1lTWFwcGluZykgbWFwcGluZ3MuZ2V0KG1hcFtpXSk7Ci0JCQkJTWltZU1hcHBpbmcgbWFwcGluZ0IgPSAoTWltZU1hcHBpbmcpIG1hcHBpbmdzLmdldChtYXBbal0pOwotCQkJCWlmIChtYXBwaW5nQS5nZXRNaW1lVHlwZSgpLmNvbXBhcmVUbyhtYXBwaW5nQi5nZXRNaW1lVHlwZSgpKSA+IDAgfHwKLQkJCQkJCSgobWFwcGluZ0EuZ2V0TWltZVR5cGUoKS5lcXVhbHMobWFwcGluZ0IuZ2V0TWltZVR5cGUoKSkpICYmCi0JCQkJCQkJCW1hcHBpbmdBLmdldEV4dGVuc2lvbigpLmNvbXBhcmVUbyhtYXBwaW5nQi5nZXRFeHRlbnNpb24oKSkgPiAwKSkgewotCQkJCQlpbnQgdGVtcCA9IG1hcFtpXTsKLQkJCQkJbWFwW2ldID0gbWFwW2pdOwotCQkJCQltYXBbal0gPSB0ZW1wOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZGlzcGxheSB0aGVtCi0JCU1hcCBoYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNaW1lTWFwcGluZyBtYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQobWFwW2ldKTsKLQkJCS8vIGdldCBwYXJlbnQgbm9kZQotCQkJVHJlZUl0ZW0gcGFyZW50ID0gKFRyZWVJdGVtKSBoYXNoLmdldChtYXBwaW5nLmdldE1pbWVUeXBlKCkpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gbmV3IFRyZWVJdGVtKG1pbWVUeXBlcywgU1dULk5PTkUpOwotCQkJCXBhcmVudC5zZXRUZXh0KG1hcHBpbmcuZ2V0TWltZVR5cGUoKSk7Ci0JCQkJcGFyZW50LnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJCQloYXNoLnB1dChtYXBwaW5nLmdldE1pbWVUeXBlKCksIHBhcmVudCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFkZCBub2RlCi0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG1hcHBpbmcuZ2V0RXh0ZW5zaW9uKCkpOwotCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfTUlNRV9FWFRFTlNJT04pKTsKLQkJCWl0ZW0uc2V0RGF0YShuZXcgSW50ZWdlcihtYXBbaV0pKTsKLQkJfQotCQkKLQkJaWYgKHJlYWRPbmx5KSB7Ci0JCQlhZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZWxlY3RNaW1lTWFwcGluZygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgyCi0JICogQHBhcmFtIG1hcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleDIsIE1pbWVNYXBwaW5nIG1hcCkgewotCQltYXBwaW5ncy5hZGQoaW5kZXgyLCBtYXApOwotCQkKLQkJLy8gY29ycmVjdCBhbGwgaW5kZXggbnVtYmVycwotCQlpbnQgc2l6ZSA9IG1pbWVUeXBlcy5nZXRJdGVtQ291bnQoKTsKLQkJVHJlZUl0ZW1bXSBwYXJlbnRzID0gbWltZVR5cGVzLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBwYXJlbnRzW2ldOwotCQkJCi0JCQlpbnQgc2l6ZTIgPSBwYXJlbnQuZ2V0SXRlbUNvdW50KCk7Ci0JCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGNoaWxkcmVuW2pdLmdldERhdGEoKTsKLQkJCQlpZiAoaW4uaW50VmFsdWUoKSA+PSBpbmRleDIpCi0JCQkJCWNoaWxkcmVuW2pdLnNldERhdGEobmV3IEludGVnZXIoaW4uaW50VmFsdWUoKSArIDEpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBwYXJlbnQuIElmIHNvLCBqdXN0IGFkZCBhIG5ldyBjaGlsZAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCWlmIChwYXJlbnQuZ2V0VGV4dCgpLmVxdWFscyhtYXAuZ2V0TWltZVR5cGUoKSkpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dChtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQkJCWl0ZW0uc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX01JTUVfRVhURU5TSU9OKSk7Ci0JCQkJaXRlbS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluZGV4MikpOwotCQkJCW1pbWVUeXBlcy5zaG93SXRlbShpdGVtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIG5vdCwgYWRkIGEgbmV3IHBhcmVudCBhbmQgY2hpbGQgdG8gdGhlIGVuZAotCQlUcmVlSXRlbSBwYXJlbnQgPSBuZXcgVHJlZUl0ZW0obWltZVR5cGVzLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRUZXh0KG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJcGFyZW50LnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJCi0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlpdGVtLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX0VYVEVOU0lPTikpOwotCQlpdGVtLnNldERhdGEobmV3IEludGVnZXIoaW5kZXgyKSk7Ci0JCW1pbWVUeXBlcy5zaG93SXRlbShpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGluZGV4MgotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgyLCBNaW1lTWFwcGluZyBtYXApIHsKLQkJTWltZU1hcHBpbmcgb2xkTWFwID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQoaW5kZXgyKTsKLQkJbWFwcGluZ3Muc2V0KGluZGV4MiwgbWFwKTsKLQkJCi0JCWludCBzaXplID0gbWltZVR5cGVzLmdldEl0ZW1Db3VudCgpOwotCQlUcmVlSXRlbVtdIHBhcmVudHMgPSBtaW1lVHlwZXMuZ2V0SXRlbXMoKTsKLQkJCi0JCWlmIChvbGRNYXAuZ2V0TWltZVR5cGUoKS5lcXVhbHMobWFwLmdldE1pbWVUeXBlKCkpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVRyZWVJdGVtIHBhcmVudCA9IHBhcmVudHNbaV07Ci0JCQkJCi0JCQkJaWYgKHBhcmVudC5nZXRUZXh0KCkuZXF1YWxzKG1hcC5nZXRNaW1lVHlwZSgpKSkgewotCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnQuZ2V0SXRlbUNvdW50KCk7Ci0JCQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGNoaWxkcmVuW2pdLmdldERhdGEoKTsKLQkJCQkJCWlmIChpbi5pbnRWYWx1ZSgpID09IGluZGV4MikgewotCQkJCQkJCWNoaWxkcmVuW2pdLnNldFRleHQobWFwLmdldEV4dGVuc2lvbigpKTsKLQkJCQkJCQljaGlsZHJlbltqXS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluZGV4MikpOwotCQkJCQkJCW1pbWVUeXBlcy5zaG93SXRlbShjaGlsZHJlbltqXSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBvdGhlcndpc2UsIGxldCdzIHRyeSBhIHJlbW92ZSBhbmQgYW4gYWRkCi0JCXJlbW92ZU1pbWVNYXBwaW5nKGluZGV4Mik7Ci0JCWFkZE1pbWVNYXBwaW5nKGluZGV4MiwgbWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBtaW1lIG1hcHBpbmcgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleDIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgyKSB7Ci0JCW1hcHBpbmdzLnJlbW92ZShpbmRleDIpOwotCQkKLQkJLy8gcmVtb3ZlIGl0ZW0KLQkJaW50IHNpemUgPSBtaW1lVHlwZXMuZ2V0SXRlbUNvdW50KCk7Ci0JCVRyZWVJdGVtW10gcGFyZW50cyA9IG1pbWVUeXBlcy5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCQotCQkJaW50IHNpemUyID0gcGFyZW50LmdldEl0ZW1Db3VudCgpOwotCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBjaGlsZHJlbltqXS5nZXREYXRhKCk7Ci0JCQkJaWYgKGluLmludFZhbHVlKCkgPT0gaW5kZXgyKSB7Ci0JCQkJCWNoaWxkcmVuW2pdLmRpc3Bvc2UoKTsKLQkJCQkJaWYgKHNpemUyID09IDEpCi0JCQkJCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJCQlpICs9IHNpemU7Ci0JCQkJCWogKz0gc2l6ZTI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjb3JyZWN0IGFsbCBpbmRleCBudW1iZXJzCi0JCXNpemUgPSBtaW1lVHlwZXMuZ2V0SXRlbUNvdW50KCk7Ci0JCXBhcmVudHMgPSBtaW1lVHlwZXMuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRyZWVJdGVtIHBhcmVudCA9IHBhcmVudHNbaV07Ci0JCQkKLQkJCWludCBzaXplMiA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsKLQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgY2hpbGRyZW5bal0uZ2V0RGF0YSgpOwotCQkJCWlmIChpbi5pbnRWYWx1ZSgpID4gaW5kZXgyKQotCQkJCQljaGlsZHJlbltqXS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluLmludFZhbHVlKCkgLSAxKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RNaW1lTWFwcGluZygpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbWltZVR5cGVzLmdldFNlbGVjdGlvbigpWzBdOwotCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBpdGVtLmdldERhdGEoKTsKLQkJCWlmIChpbiA9PSBudWxsKSB7Ci0JCQkJaW5kZXggPSAtMTsKLQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbmRleCA9IGluLmludFZhbHVlKCk7Ci0JCQkKLQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZWRpdC5zZXRFbmFibGVkKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaW5kZXggPSAtMTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJmNDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRvbWNhdCBjb25maWd1cmF0aW9uIHBvcnQgZWRpdG9yIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0Q29uZmlndXJhdGlvbiB0b21jYXRDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgcG9ydHM7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvblBvcnRFZGl0b3JTZWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfUE9SVF9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQljaGFuZ2VQb3J0TnVtYmVyKGlkLCBpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdG9tY2F0Q29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VQb3J0TnVtYmVyKFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBwb3J0cy5nZXRJdGVtcygpOwotCQlpbnQgc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYgKHNwLmdldElkKCkuZXF1YWxzKGlkKSkgewotCQkJCWl0ZW1zW2ldLnNldERhdGEobmV3IFNlcnZlclBvcnQoaWQsIHNwLmdldE5hbWUoKSwgcG9ydCwgc3AuZ2V0UHJvdG9jb2woKSkpOwotCQkJCWl0ZW1zW2ldLnNldFRleHQoMSwgcG9ydCArICIiKTsKLQkJCQkvKmlmIChpID09IHNlbGVjdGlvbikgewotCQkJCQlzZWxlY3RQb3J0KCk7Ci0JCQkJfSovCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRAotCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQkvLyBwb3J0cwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDg7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDg7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUUyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0KLQkJcG9ydHMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJcG9ydHMuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJcG9ydHMuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl3aHMuc2V0SGVscChwb3J0cywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUU19MSVNUKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihwb3J0cywgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUG9ydE5hbWVDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxNSwgMTUwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4ocG9ydHMsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMzA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJcG9ydHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcG9ydHMuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBvcnRzKTsKLQkJdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJwb3J0In0pOwotCi0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBvcnRFZGl0b3JzKCkgewotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMobmV3IENlbGxFZGl0b3JbXSB7bnVsbCwgbmV3IFRleHRDZWxsRWRpdG9yKHBvcnRzKX0pOwotCQotCQlJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllciA9IG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBlbGVtZW50OwotCQkJCWlmIChzcC5nZXRQb3J0KCkgPCAwKQotCQkJCQlyZXR1cm4gIi0iOwotCQkJCXJldHVybiBzcC5nZXRQb3J0KCkgKyAiIjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJaWYgKCJwb3J0Ii5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVBvcnRDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIHNwLmdldElkKCksIHBvcnQpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9OwotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGNlbGxNb2RpZmllcik7Ci0JCQotCQkvLyBwcmVzZWxlY3Qgc2Vjb25kIGNvbHVtbiAoV2luZG93cy1vbmx5KQotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJaWYgKG9zICE9IG51bGwgJiYgb3MudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW4iKSA+PSAwKSB7Ci0JCQlwb3J0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IG4gPSBwb3J0cy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KHBvcnRzLmdldEl0ZW0obikuZ2V0RGF0YSgpLCAxKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRvbWNhdENvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24gPSB0cy5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChwb3J0cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXBvcnRzLnJlbW92ZUFsbCgpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9tY2F0Q29uZmlndXJhdGlvbi5nZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocG9ydHMsIFNXVC5OT05FKTsKLQkJCVN0cmluZyBwb3J0U3RyID0gIi0iOwotCQkJaWYgKHBvcnQuZ2V0UG9ydCgpID49IDApCi0JCQkJcG9ydFN0ciA9IHBvcnQuZ2V0UG9ydCgpICsgIiI7IAotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbXSB7cG9ydC5nZXROYW1lKCksIHBvcnRTdHJ9OwotCQkJaXRlbS5zZXRUZXh0KHMpOwotCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUE9SVCkpOwotCQkJaXRlbS5zZXREYXRhKHBvcnQpOwotCQl9Ci0JCQotCQlpZiAocmVhZE9ubHkpIHsKLQkJCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhuZXcgQ2VsbEVkaXRvcltdIHtudWxsLCBudWxsfSk7Ci0JCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG51bGwpOwotCQl9IGVsc2UgewotCQkJc2V0dXBQb3J0RWRpdG9ycygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25XZWJNb2R1bGVFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MDdmMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0OwotLyoqCi0gKiBUb21jYXQgY29uZmlndXJhdGlvbiB3ZWIgbW9kdWxlIGVkaXRvciBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQgZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JQYXJ0IHsKLQlwcm90ZWN0ZWQgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjI7Ci0JcHJvdGVjdGVkIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBUYWJsZSB3ZWJBcHBUYWJsZTsKLQlwcm90ZWN0ZWQgaW50IHNlbGVjdGlvbiA9IC0xOwotCXByb3RlY3RlZCBCdXR0b24gYWRkUHJvamVjdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEV4dFByb2plY3Q7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uQUREX1dFQl9NT0RVTEVfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpbml0aWFsaXplKCk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLlJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCQotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IHRvb2xraXQuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCXRvb2xraXQuZGVjb3JhdGVGb3JtSGVhZGluZyhmb3JtLmdldEZvcm0oKSk7Ci0JCWZvcm0uc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2VUaXRsZSk7Ci0JCWZvcm0uc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX1dFQl9NT0RVTEUpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luVG9wID0gNjsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSA2OwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzU2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJd2ViQXBwVGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXdlYkFwcFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXdlYkFwcFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJd2hzLnNldEhlbHAod2ViQXBwVGFibGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19MSVNUKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih3ZWJBcHBUYWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDIgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sMi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JEb2NCYXNlQ29sdW1uKTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEzLCAxMzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wzID0gbmV3IFRhYmxlQ29sdW1uKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbDMuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdENvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDQgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sNC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW4pOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNywgNzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJd2ViQXBwVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQl3ZWJBcHBUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3ZWJBcHBUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RXZWJBcHAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCUNvbXBvc2l0ZSByaWdodFBhbmVsID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJpZ2h0UGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcmlnaHRQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyaWdodFBhbmVsKTsKLQkKLQkJLy8gYnV0dG9ucyBzdGlsbCB0byBhZGQ6Ci0JCS8vIGFkZCBwcm9qZWN0LCBhZGQgZXh0ZXJuYWwgbW9kdWxlLCByZW1vdmUgbW9kdWxlCi0JCWFkZFByb2plY3QgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWRkUHJvamVjdE1vZHVsZSwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWFkZFByb2plY3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAoYWRkUHJvamVjdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9QUk9KRUNUKTsKLQkKLQkJLy8gZGlzYWJsZSB0aGUgYWRkIHByb2plY3QgbW9kdWxlIGJ1dHRvbiBpZiB0aGVyZSBhcmUgbm8KLQkJLy8gd2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2gKLQkJaWYgKCFjYW5BZGRXZWJNb2R1bGUoKSkKLQkJCWFkZFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJYWRkUHJvamVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgdHJ1ZSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJCWV4ZWN1dGUobmV3IEFkZE1vZHVsZUNvbW1hbmQoZ2V0U2VydmVyKCksIGRpYWxvZy5tb2R1bGU0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQotCQlhZGRFeHRQcm9qZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocmlnaHRQYW5lbCwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkRXh0UHJvamVjdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhZGRFeHRQcm9qZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgZmFsc2UpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIGRpYWxvZy5nZXRXZWJNb2R1bGUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGFkZEV4dFByb2plY3QsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfRVhURVJOQUwpOwotCQkKLQkJZWRpdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJpZ2h0UGFuZWwsIE1lc3NhZ2VzLmVkaXRvckVkaXQsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQllZGl0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KHNlbGVjdGlvbik7Ci0JCQkJV2ViTW9kdWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBXZWJNb2R1bGVEaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGdldFNlcnZlcigpLCBzZXJ2ZXIyLCBjb25maWd1cmF0aW9uLCBtb2R1bGUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIHNlbGVjdGlvbiwgZGlhbG9nLmdldFdlYk1vZHVsZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWRpdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0VESVQpOwotCQotCQlyZW1vdmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5lZGl0b3JSZW1vdmUsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHdlYkFwcFRhYmxlLmdldEl0ZW0oc2VsZWN0aW9uKTsKLQkJCQlpZiAoaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVtLmdldERhdGEoKTsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlTW9kdWxlQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbW9kdWxlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZChjb25maWd1cmF0aW9uLCBzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2VsZWN0aW9uID0gLTE7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChyZW1vdmUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19SRU1PVkUpOwotCQkKLQkJZm9ybS5zZXRDb250ZW50KHNlY3Rpb24pOwotCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQkJCi0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5BZGRXZWJNb2R1bGUoKSB7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlc1tpXS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9LCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5pc09LKCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcywgbnVsbCk7Ci0JCXRyeSB7Ci0JCQljb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIyID0gKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmxvYWRBZGFwdGVyKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKHdlYkFwcFRhYmxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJd2ViQXBwVGFibGUucmVtb3ZlQWxsKCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlMaXN0IGxpc3QgPSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJCQotCQkJU3RyaW5nIG1lbWVudG8gPSBtb2R1bGUuZ2V0TWVtZW50bygpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gIiI7Ci0JCQlJbWFnZSBwcm9qZWN0SW1hZ2UgPSBudWxsOwotCQkJaWYgKG1lbWVudG8gIT0gbnVsbCAmJiBtZW1lbnRvLmxlbmd0aCgpID4gMCkgewotCQkJCXByb2plY3ROYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RNaXNzaW5nLCBuZXcgU3RyaW5nW10ge21lbWVudG99KTsKLQkJCQlwcm9qZWN0SW1hZ2UgPSBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUFJPSkVDVF9NSVNTSU5HKTsKLQkJCQlJTW9kdWxlIG1vZHVsZTIgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShtZW1lbnRvKTsKLQkJCQlpZiAobW9kdWxlMiAhPSBudWxsKSB7Ci0JCQkJCXByb2plY3ROYW1lID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KG1vZHVsZTIpOwotCQkJCQlwcm9qZWN0SW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG1vZHVsZTIpOwotCQkJCQlpdGVtLnNldERhdGEobW9kdWxlMik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlTdHJpbmcgcmVsb2FkID0gbW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZEVuYWJsZWQgOiBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkRGlzYWJsZWQ7Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tdIHttb2R1bGUuZ2V0UGF0aCgpLCBtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCksIHByb2plY3ROYW1lLCByZWxvYWR9OwotCQkJaXRlbS5zZXRUZXh0KHMpOwotCQkJaXRlbS5zZXRJbWFnZSgwLCBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfV0VCX01PRFVMRSkpOwotCQkJaWYgKHByb2plY3RJbWFnZSAhPSBudWxsKQotCQkJCWl0ZW0uc2V0SW1hZ2UoMiwgcHJvamVjdEltYWdlKTsKLQkJCQotCQkJaWYgKCFpc0RvY3VtZW50QmFzZVZhbGlkKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSkpIHsKLQkJCQlpdGVtLnNldEltYWdlKDEsIFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19QUk9KRUNUX01JU1NJTkcpKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JNaXNzaW5nV2ViTW9kdWxlLCBtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpKTsKLQkJCX0KLQkJfQotCQlsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkJCi0JCWlmIChyZWFkT25seSkgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGNhbkFkZFdlYk1vZHVsZSgpKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFdlYkFwcCgpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlzZWxlY3Rpb24gPSB3ZWJBcHBUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSAtMTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudEJhc2VWYWxpZChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQkvLyBjaGVjayBhYnNvbHV0ZSBwYXRoCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHMpOwotCQlpZiAoZi5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gY2hlY2sgd29ya3NwYWNlCi0JCXRyeSB7Ci0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHMpLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gYmFkIHBhdGgKLQkJfQotCQkKLQkJaWYgKHMuc3RhcnRzV2l0aChjb25maWd1cmF0aW9uLmdldERvY0Jhc2VQcmVmaXgoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHQgPSBzLnN1YnN0cmluZyhjb25maWd1cmF0aW9uLmdldERvY0Jhc2VQcmVmaXgoKS5sZW5ndGgoKSk7Ci0JCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0KS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGJhZCBwYXRoCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHNlcnZlciByZWxhdGl2ZSBwYXRoCi0JCXRyeSB7Ci0JCQlmID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChzKS50b0ZpbGUoKTsKLQkJCWlmIChmLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gYmFkIHBhdGgKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAod2ViQXBwVGFibGUgIT0gbnVsbCkKLQkJCXdlYkFwcFRhYmxlLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL01pbWVNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjVmZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIERpYWxvZyB0byBhZGQgb3IgbW9kaWZ5IG1pbWUgbWFwcGluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG1hcDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQ7Ci0KLQkvKioKLQkgKiBNaW1lTWFwcGluZ0RpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBuZXcgTWltZU1hcHBpbmcoIiIsICIiKSk7Ci0JCWlzRWRpdCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1pbWVNYXBwaW5nRGlhbG9nIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIG1hcCBhIG1pbWUgbWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5tYXAgPSBtYXA7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJaWYgKGlzRWRpdCkKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlRWRpdCk7Ci0JCWVsc2UKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoCi0JICogc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPRyk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lVHlwZSk7Ci0JCWZpbmFsIFRleHQgdHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXR5cGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZS5zZXRUZXh0KG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJdHlwZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQltYXAgPSBuZXcgTWltZU1hcHBpbmcobWFwLmdldEV4dGVuc2lvbigpLCB0eXBlLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHR5cGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR19ESUFMT0dfVFlQRSk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uKTsKLQkJZmluYWwgVGV4dCBleHRlbnNpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQlleHRlbnNpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZXh0ZW5zaW9uLnNldFRleHQobWFwLmdldEV4dGVuc2lvbigpKTsKLQkJZXh0ZW5zaW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCW1hcCA9IG5ldyBNaW1lTWFwcGluZyhleHRlbnNpb24uZ2V0VGV4dCgpLCBtYXAuZ2V0TWltZVR5cGUoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGV4dGVuc2lvbiwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPR19FWFRFTlNJT04pOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGUoKTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCWlmIChtYXAuZ2V0RXh0ZW5zaW9uKCkgPT0gbnVsbCB8fCBtYXAuZ2V0RXh0ZW5zaW9uKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJaWYgKG1hcC5nZXRNaW1lVHlwZSgpID09IG51bGwgfHwgbWFwLmdldE1pbWVUeXBlKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQob2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWltZSBtYXBwaW5nLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5NaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZyBnZXRNaW1lTWFwcGluZygpIHsKLQkJcmV0dXJuIG1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzM4NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0VmVyc2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldERlYnVnTW9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNlY3VyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0vKioKLSAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNlY3VyZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlYnVnOwotCXByb3RlY3RlZCBCdXR0b24gbm9QdWJsaXNoOwotCXByb3RlY3RlZCBCdXR0b24gc2VwYXJhdGVDb250ZXh0RmlsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub1B1Ymxpc2hDaGFuZ2VkOwotCXByb3RlY3RlZCBib29sZWFuIHNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZDsKLQotCS8qKgotCSAqIFNlcnZlckdlbmVyYWxFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VDVVJFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCVNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLnRoaXMuc2VjdXJlLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERUJVRy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLmRlYnVnLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKElUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VSVkVfTU9EVUxFU19XSVRIT1VUX1BVQkxJU0guZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24udGhpcy5ub1B1Ymxpc2guc2V0U2VsZWN0aW9uKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkvLyBJbmRpY2F0ZSB0aGlzIHNldHRpbmcgaGFzIGNoYW5nZWQKLQkJCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChJVG9tY2F0U2VydmVyLlBST1BFUlRZX1NBVkVfU0VQQVJBVEVfQ09OVEVYVF9GSUxFUy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLnNlcGFyYXRlQ29udGV4dEZpbGVzLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJLy8gSW5kaWNhdGUgdGhpcyBzZXR0aW5nIGhhcyBjaGFuZ2VkCi0JCQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yR2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvckdlbmVyYWxEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyBzZXJ2ZSBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaAotCQlub1B1Ymxpc2ggPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvck5vUHVibGlzaCwgIiIpLCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlub1B1Ymxpc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbm9QdWJsaXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2hDb21tYW5kKHRvbWNhdFNlcnZlciwgbm9QdWJsaXNoLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJLy8gSW5kaWNhdGUgdGhpcyBzZXR0aW5nIGhhcyBjaGFuZ2VkCi0JCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IHRydWU7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCS8vIFRPRE8gQWRkcmVzcyBoZWxwCi0vLwkJd2hzLnNldEhlbHAobm9QdWJsaXNoLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfU0VDVVJFKTsKLQotCQkvLyBzYXZlIHNlcGFyYXRlIGNvbnRleHQgWE1MIGZpbGVzCi0JCXNlcGFyYXRlQ29udGV4dEZpbGVzID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXBhcmF0ZUNvbnRleHRGaWxlcywgIiIpLCBTV1QuQ0hFQ0spOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXBhcmF0ZUNvbnRleHRGaWxlcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZXBhcmF0ZUNvbnRleHRGaWxlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQodG9tY2F0U2VydmVyLCBzZXBhcmF0ZUNvbnRleHRGaWxlcy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCS8vIEluZGljYXRlIHRoaXMgc2V0dGluZyBoYXMgY2hhbmdlZAotCQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCS8vIFRPRE8gQWRkcmVzcyBoZWxwCi0vLwkJd2hzLnNldEhlbHAoc2VwYXJhdGVDb250ZXh0RmlsZXMsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUl9TRUNVUkUpOwotCQkKLQkJLy8gc2VjdXJpdHkKLQkJc2VjdXJlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZWN1cmUsIFNXVC5DSEVDSyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlY3VyZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZWN1cmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRTZWN1cmVDb21tYW5kKHRvbWNhdFNlcnZlciwgc2VjdXJlLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHNlY3VyZSwgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX1NFQ1VSRSk7Ci0JCi0JCS8vIGRlYnVnIG1vZGUKLQkJZGVidWcgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvckRlYnVnTW9kZSwgIiIpLCBTV1QuQ0hFQ0spOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZWJ1Zy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWJ1Zy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldERlYnVnTW9kZUNvbW1hbmQodG9tY2F0U2VydmVyLCBkZWJ1Zy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChkZWJ1ZywgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX0RFQlVHX01PREUpOwotCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQl0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoc2VjdXJlID09IG51bGwgfHwgdG9tY2F0U2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQkJSVRvbWNhdFZlcnNpb25IYW5kbGVyIHR2aCA9IHRvbWNhdFNlcnZlci5nZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpOwotCQkKLQkJYm9vbGVhbiBzdXBwb3J0ZWQgPSB0dmguc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpOwotCQlTdHJpbmcgbGFiZWwgPSBOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JOb1B1Ymxpc2gsCi0JCQkJc3VwcG9ydGVkID8gIiIgOiBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JOb3RTdXBwb3J0ZWQpOwotCQlub1B1Ymxpc2guc2V0VGV4dChsYWJlbCk7Ci0JCW5vUHVibGlzaC5zZXRTZWxlY3Rpb24odG9tY2F0U2VydmVyLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJbm9QdWJsaXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlub1B1Ymxpc2guc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlzdXBwb3J0ZWQgPSB0dmguc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpOwotCQlsYWJlbCA9IE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcGFyYXRlQ29udGV4dEZpbGVzLAotCQkJCXN1cHBvcnRlZCA/ICIiIDogTWVzc2FnZXMuc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkKTsKLQkJc2VwYXJhdGVDb250ZXh0RmlsZXMuc2V0VGV4dChsYWJlbCk7Ci0JCXNlcGFyYXRlQ29udGV4dEZpbGVzLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoKSk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJc2VwYXJhdGVDb250ZXh0RmlsZXMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJc2VjdXJlLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNTZWN1cmUoKSk7Ci0JCQotCQlzdXBwb3J0ZWQgPSB0dmguc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCk7Ci0JCWxhYmVsID0gTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yRGVidWdNb2RlLAotCQkJCXN1cHBvcnRlZCA/ICIiIDogTWVzc2FnZXMuc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkKTsKLQkJZGVidWcuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJZGVidWcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJZGVidWcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWRlYnVnLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNEZWJ1ZygpKTsKLQkJfQotCQkKLQkJaWYgKHJlYWRPbmx5KQotCQkJc2VjdXJlLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlzZWN1cmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCi0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2dldFNhdmVTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJLy8gSWYgc2VydmUgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcgaGFzIGNoYW5nZWQsIHJlcXVlc3QgY2xlYW4gcHVibGlzaCB0byBiZSBzYWZlCi0JCWlmIChub1B1Ymxpc2hDaGFuZ2VkKSB7Ci0JCQkvLyBJZiBzZXJ2ZXIgaXMgcnVubmluZywgYWJvcnQgdGhlIHNhdmUgc2luY2UgY2xlYW4gcHVibGlzaCB3b24ndCBzdWNjZWVkCi0JCQlpZiAodG9tY2F0U2VydmVyLmdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclNlcnZlck11c3RCZVN0b3BwZWQsCi0JCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yTm9QdWJsaXNoLCAiIikudHJpbSgpKSkKLQkJCQl9OwotCQkJfQotCQkJLy8gRm9yY2UgYSBjbGVhbiBwdWJsaXNoCi0JCQl0b21jYXRTZXJ2ZXIuZ2V0U2VydmVyKCkucHVibGlzaChJU2VydmVyLlBVQkxJU0hfQ0xFQU4sIG51bGwsIG51bGwsIG51bGwpOwotCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChzZXBhcmF0ZUNvbnRleHRGaWxlc0NoYW5nZWQpIHsKLQkJCS8vIElmIHNlcnZlciBpcyBydW5uaW5nLCBhYm9ydCB0aGUgc2F2ZSBzaW5jZSBjb250ZXh0cyB3aWxsIGJlIG1vdmluZwotCQkJaWYgKHRvbWNhdFNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCXJldHVybiBuZXcgSVN0YXR1cyBbXSB7Ci0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJNdXN0QmVTdG9wcGVkLAotCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcGFyYXRlQ29udGV4dEZpbGVzLCAiIikudHJpbSgpKSkKLQkJCQl9OwotCQkJfQotCQl9Ci0JCS8vIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBzdWNjZXNzCi0JCXJldHVybiBzdXBlci5nZXRTYXZlU3RhdHVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNTE4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldERlcGxveURpcmVjdG9yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQdWJsaXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0vKioKLSAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByb3RlY3RlZCBTZWN0aW9uIHNlY3Rpb247Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgSHlwZXJsaW5rIHNldERlZmF1bHREZXBsb3lEaXI7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdERlcGxveURpcklzU2V0OwotCQotCXByb3RlY3RlZCBCdXR0b24gc2VydmVyRGlyTWV0YWRhdGE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZXJ2ZXJEaXJJbnN0YWxsOwotCXByb3RlY3RlZCBCdXR0b24gc2VydmVyRGlyQ3VzdG9tOwotCQotCXByb3RlY3RlZCBUZXh0IHNlcnZlckRpcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlcnZlckRpckJyb3dzZTsKLQlwcm90ZWN0ZWQgVGV4dCBkZXBsb3lEaXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXBsb3lEaXJCcm93c2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIElQYXRoIHdvcmtzcGFjZVBhdGg7Ci0JcHJvdGVjdGVkIElQYXRoIGRlZmF1bHREZXBsb3lQYXRoOwotCQotCXByb3RlY3RlZCBib29sZWFuIGFsbG93UmVzdHJpY3RlZEVkaXRpbmc7Ci0JcHJvdGVjdGVkIElQYXRoIHRlbXBEaXJQYXRoOwotCXByb3RlY3RlZCBJUGF0aCBpbnN0YWxsRGlyUGF0aDsKLQotCS8vIEF2b2lkIGhhcmRjb2RpbmcgdGhpcyBhdCBzb21lIHBvaW50Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFEQVRBRElSID0gIi5tZXRhZGF0YSI7Ci0JLyoqCi0JICogU2VydmVyR2VuZXJhbEVkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBkZXRlY3QgdW5kbyBjaGFuZ2VzIGFuZCBwdWJsaXNoaW5nIG9mIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlpZiAoSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9JTlNUQU5DRV9ESVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKQotCQkJCQkJfHwgSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9URVNUX0VOVklST05NRU5ULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJdXBkYXRlU2VydmVyRGlyQnV0dG9ucygpOwotCQkJCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERVBMT1lfRElSLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24udGhpcy5kZXBsb3lEaXIuc2V0VGV4dChzKTsKLQkJCQkJdXBkYXRlRGVmYXVsdERlcGxveUxpbmsoKTsJCQkJCQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9OwotCQlzZXJ2ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCWJvb2xlYW4gZmxhZyA9IGZhbHNlOwotCQkJCWlmIChzdGF0dXMuaXNPSygpICYmIHNlcnZlcjIuZ2V0TW9kdWxlcygpLmxlbmd0aCA9PSAwKQotCQkJCQlmbGFnID0gdHJ1ZTsKLQkJCQlpZiAoZmxhZyAhPSBhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKSB7Ci0JCQkJCWFsbG93UmVzdHJpY3RlZEVkaXRpbmcgPSBmbGFnOwotCQkJCQkvLyBVcGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBmaWVsZHMKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlib29sZWFuIGN1c3RvbVNlcnZlckRpciA9IGZhbHNlOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQ3VzdG9tLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJY3VzdG9tU2VydmVyRGlyID0gU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQ3VzdG9tLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyTWV0YWRhdGEuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlTZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXJEaXJNZXRhZGF0YS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlySW5zdGFsbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckluc3RhbGwuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJCQkJCQlpZiAoIVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckN1c3RvbS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckN1c3RvbS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQnJvd3NlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2V0RGVmYXVsdERlcGxveURpci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNldERlZmF1bHREZXBsb3lEaXIuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJCQkJCQlpZiAoIVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLmRlcGxveURpci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLmRlcGxveURpci5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuZGVwbG95RGlyQnJvd3NlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuZGVwbG95RGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2VydmVyLmdldE9yaWdpbmFsKCkuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCi0JCXNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yTG9jYXRpb25zU2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuc2VydmVyRWRpdG9yTG9jYXRpb25zRGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1IpOwotCQl3aHMuc2V0SGVscChzZWN0aW9uLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1IpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCi0JCXNlcnZlckRpck1ldGFkYXRhID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JEb2VzTm90TW9kaWZ5KSwgU1dULlJBRElPKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VydmVyRGlyTWV0YWRhdGEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2VydmVyRGlyTWV0YWRhdGEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJNZXRhZGF0YS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kKHRvbWNhdFNlcnZlciwgdHJ1ZSkpOwotCQkJCXVwZGF0ZVNlcnZlckRpckZpZWxkcygpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlySW5zdGFsbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJJbnN0YWxsLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JUYWtlc0NvbnRyb2wpLCBTV1QuUkFESU8pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNlcnZlckRpckluc3RhbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJJbnN0YWxsLmdldFNlbGVjdGlvbigpKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldFRlc3RFbnZpcm9ubWVudENvbW1hbmQodG9tY2F0U2VydmVyLCBmYWxzZSkpOwotCQkJCXVwZGF0ZVNlcnZlckRpckZpZWxkcygpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlyQ3VzdG9tID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpckN1c3RvbSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yRG9lc05vdE1vZGlmeSksIFNXVC5SQURJTyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlcnZlckRpckN1c3RvbS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZXJ2ZXJEaXJDdXN0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJDdXN0b20uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHRydWUpKTsKLQkJCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIHNlcnZlciBkaXJlY3RvcnkKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlzZXJ2ZXJEaXIgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBudWxsLCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQlzZXJ2ZXJEaXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2VydmVyRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRJbnN0YW5jZURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBnZXRTZXJ2ZXJEaXIoKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlyQnJvd3NlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5lZGl0b3JCcm93c2UsIFNXVC5QVVNIKTsKLQkJc2VydmVyRGlyQnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzZXJ2ZXJEaXIuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VydmVyRWRpdG9yQnJvd3NlRGVwbG95TWVzc2FnZSk7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoc2VydmVyRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCAmJiAhc2VsZWN0ZWREaXJlY3RvcnkuZXF1YWxzKHNlcnZlckRpci5nZXRUZXh0KCkpKSB7Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJLy8gTWFrZSByZWxhdGl2ZSBpZiByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlCi0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJCWlmICh3b3Jrc3BhY2VQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCWludCBjbnQgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh3b3Jrc3BhY2VQYXRoKTsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY250KS5zZXREZXZpY2UobnVsbCk7Ci0JCQkJCQlzZWxlY3RlZERpcmVjdG9yeSA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWV4ZWN1dGUobmV3IFNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHNlbGVjdGVkRGlyZWN0b3J5KSk7Ci0JCQkJCXVwZGF0ZVNlcnZlckRpckJ1dHRvbnMoKTsKLQkJCQkJdXBkYXRlU2VydmVyRGlyRmllbGRzKCk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2VydmVyRGlyQnJvd3NlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotCQkvLyBkZXBsb3ltZW50IGRpcmVjdG9yeSBsaW5rCi0JCXNldERlZmF1bHREZXBsb3lEaXIgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjb21wb3NpdGUsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmssICIiKSwgU1dULldSQVApOwotCQlzZXREZWZhdWx0RGVwbG95RGlyLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldERlcGxveURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuREVGQVVMVF9ERVBMT1lESVIpKTsKLQkJCQlkZXBsb3lEaXIuc2V0VGV4dChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuREVGQVVMVF9ERVBMT1lESVIpOwotCQkJCXVwZGF0ZURlZmF1bHREZXBsb3lMaW5rKCk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2V0RGVmYXVsdERlcGxveURpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JCWxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JEZXBsb3lEaXIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZGVwbG95RGlyID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgbnVsbCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZGVwbG95RGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlcGxveURpci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIGRlcGxveURpci5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JCQkJdXBkYXRlRGVmYXVsdERlcGxveUxpbmsoKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlcGxveURpckJyb3dzZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuZWRpdG9yQnJvd3NlLCBTV1QuUFVTSCk7Ci0JCWRlcGxveURpckJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZGVwbG95RGlyLmdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnNlcnZlckVkaXRvckJyb3dzZURlcGxveU1lc3NhZ2UpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlcGxveURpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwgJiYgIXNlbGVjdGVkRGlyZWN0b3J5LmVxdWFscyhkZXBsb3lEaXIuZ2V0VGV4dCgpKSkgewotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldERlcGxveURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBzZWxlY3RlZERpcmVjdG9yeSkpOwotCQkJCQlkZXBsb3lEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGVwbG95RGlyQnJvd3NlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWlmIChzZXJ2ZXIuZ2V0T3JpZ2luYWwoKSAhPSBudWxsKQotCQkJCXNlcnZlci5nZXRPcmlnaW5hbCgpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCS8vIENhY2hlIHdvcmtzcGFjZSBhbmQgZGVmYXVsdCBkZXBsb3kgcGF0aHMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCXdvcmtzcGFjZVBhdGggPSByb290LmdldExvY2F0aW9uKCk7Ci0JCWRlZmF1bHREZXBsb3lQYXRoID0gbmV3IFBhdGgoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LkRFRkFVTFRfREVQTE9ZRElSKTsKLQotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQkJYWRkQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoc2VydmVyRGlyPT0gbnVsbCB8fCB0b21jYXRTZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCi0JCUlSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQkvLyBJZiBub3QgVG9tY2F0IDMuMiwgdXBkYXRlIGRlc2NyaXB0aW9uIHRvIG1lbnRpb24gY2F0YWxpbmEuYmFzZQotCQlpZiAocnVudGltZSAhPSBudWxsICYmIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLmluZGV4T2YoIjMyIikgPCAwKQotCQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JMb2NhdGlvbnNEZXNjcmlwdGlvbjIpOwotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJaW5zdGFsbERpclBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGVkaXRpbmcgb2YgbG9jYXRpb25zIGlzIGFsbG93ZWQKLQkJYWxsb3dSZXN0cmljdGVkRWRpdGluZyA9IGZhbHNlOwotCQlJUGF0aCBiYXNlUGF0aCA9IHRvbWNhdFNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkvLyBJZiBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHB1Ymxpc2hlZCwgb3Igc2VydmVyIGlzIHB1Ymxpc2hlZCB3aXRoIG5vIG1vZHVsZXMsIGFsbG93IGVkaXRpbmcKLQkJCS8vIFRPRE8gRmluZCBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSBpZiBzZXJ2ZXIgaGFzbid0IGJlZW4gcHVibGlzaGVkCi0JCQlpZiAoKGJhc2VQYXRoICE9IG51bGwgJiYgIWJhc2VQYXRoLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJCQl8fCAoc2VydmVyLmdldE9yaWdpbmFsKCkuZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkgPT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUKLQkJCQkJCQkmJiBzZXJ2ZXIuZ2V0T3JpZ2luYWwoKS5nZXRNb2R1bGVzKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJYWxsb3dSZXN0cmljdGVkRWRpdGluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFVwZGF0ZSBzZXJ2ZXIgcmVsYXRlZCBmaWVsZHMKLQkJdXBkYXRlU2VydmVyRGlyQnV0dG9ucygpOwotCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQotCQlzZXJ2ZXJEaXJNZXRhZGF0YS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCXNlcnZlckRpckN1c3RvbS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCi0JCS8vIFVwZGF0ZSBkZXBsb3ltZW50IHJlbGF0ZWQgZmllbGRzCi0JCXVwZGF0ZURlZmF1bHREZXBsb3lMaW5rKCk7Ci0JCQotCQlkZXBsb3lEaXIuc2V0VGV4dCh0b21jYXRTZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCkpOwotCi0JCXNldERlZmF1bHREZXBsb3lEaXIuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJZGVwbG95RGlyLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCWRlcGxveURpckJyb3dzZS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCi0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JCXZhbGlkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmVyRGlyKCkgewotCQlTdHJpbmcgZGlyID0gbnVsbDsKLQkJaWYgKHNlcnZlckRpciAhPSBudWxsKSB7Ci0JCQlkaXIgPSBzZXJ2ZXJEaXIuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXIpOwotCQkJLy8gQWRqdXN0IGlmIHRoZSB0ZW1wIGRpciBpcyBrbm93biBhbmQgaGFzIGJlZW4gZW50ZXJlZAotCQkJaWYgKHRlbXBEaXJQYXRoICE9IG51bGwgJiYgdGVtcERpclBhdGguZXF1YWxzKHBhdGgpKQotCQkJCWRpciA9IG51bGw7Ci0JCQkvLyBJZiB1bmRlciB0aGUgd29ya3NwYWNlLCBtYWtlIHJlbGF0aXZlCi0JCQllbHNlIGlmICh3b3Jrc3BhY2VQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQlpbnQgY250ID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod29ya3NwYWNlUGF0aCk7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjbnQpLnNldERldmljZShudWxsKTsKLQkJCQlkaXIgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXJ2ZXJEaXJCdXR0b25zKCkgewotCQlpZiAodG9tY2F0U2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCkgPT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IHRvbWNhdFNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJaWYgKHBhdGguZXF1YWxzKGluc3RhbGxEaXJQYXRoKSkgewotCQkJCXNlcnZlckRpckluc3RhbGwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXNlcnZlckRpck1ldGFkYXRhLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJc2VydmVyRGlyQ3VzdG9tLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXJ2ZXJEaXJNZXRhZGF0YS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJc2VydmVyRGlySW5zdGFsbC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNlcnZlckRpckN1c3RvbS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2VydmVyRGlyQ3VzdG9tLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXNlcnZlckRpck1ldGFkYXRhLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VydmVyRGlyRmllbGRzKCkgewotCQl1cGRhdGVTZXJ2ZXJEaXIoKTsKLQkJYm9vbGVhbiBjdXN0b21TZXJ2ZXJEaXIgPSBzZXJ2ZXJEaXJDdXN0b20uZ2V0U2VsZWN0aW9uKCk7Ci0JCXNlcnZlckRpci5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcgJiYgY3VzdG9tU2VydmVyRGlyKTsKLQkJc2VydmVyRGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXJ2ZXJEaXIoKSB7Ci0JCUlQYXRoIHBhdGggPSB0b21jYXRTZXJ2ZXIuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJaWYgKHdvcmtzcGFjZVBhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJaW50IGNudCA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZVBhdGgpOwotCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjbnQpLnNldERldmljZShudWxsKTsKLQkJCXNlcnZlckRpci5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKLQkJCS8vIGNhY2hlIHRoZSByZWxhdGl2ZSB0ZW1wIGRpciBwYXRoIGlmIHRoYXQgaXMgd2hhdCB3ZSBoYXZlCi0JCQlpZiAodGVtcERpclBhdGggPT0gbnVsbCkgewotCQkJCWlmICh0b21jYXRTZXJ2ZXIuaXNUZXN0RW52aXJvbm1lbnQoKSAmJiB0b21jYXRTZXJ2ZXIuZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKSA9PSBudWxsKQotCQkJCQl0ZW1wRGlyUGF0aCA9IHBhdGg7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJc2VydmVyRGlyLnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0RGVwbG95TGluaygpIHsKLQkJYm9vbGVhbiBuZXdTdGF0ZSA9IGRlZmF1bHREZXBsb3lQYXRoLmVxdWFscyhuZXcgUGF0aCh0b21jYXRTZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCkpKTsKLQkJaWYgKG5ld1N0YXRlICE9IGRlZmF1bHREZXBsb3lEaXJJc1NldCkgewotCQkJc2V0RGVmYXVsdERlcGxveURpci5zZXRUZXh0KAotCQkJCQluZXdTdGF0ZSA/IE1lc3NhZ2VzLnNlcnZlckVkaXRvclNldERlZmF1bHREZXBsb3lEaXJMaW5rMgotCQkJCQkJCTogTWVzc2FnZXMuc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmspOwotCQkJZGVmYXVsdERlcGxveURpcklzU2V0ID0gbmV3U3RhdGU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2dldFNhdmVTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJaWYgKHRvbWNhdFNlcnZlciAhPSBudWxsKSB7Ci0JCQkvLyBDaGVjayB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JCQlTdHJpbmcgZGlyID0gdG9tY2F0U2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlyKTsKLQkJCQkvLyBNdXN0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgd29ya3NwYWNlIGxvY2F0aW9uCi0JCQkJaWYgKGRpci5sZW5ndGgoKSA9PSAwIHx8IHdvcmtzcGFjZVBhdGguZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCXJldHVybiBuZXcgSVN0YXR1cyBbXSB7Ci0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yU2VydmVyRGlySXNSb290KX07Ci0JCQkJfQotCQkJCS8vIFVzZXIgc3BlY2lmaWVkIHZhbHVlIG1heSBub3QgYmUgdW5kZXIgdGhlICIubWV0YWRhdGEiIGZvbGRlciBvZiB0aGUgd29ya3NwYWNlIAotCQkJCWVsc2UgaWYgKHdvcmtzcGFjZVBhdGguaXNQcmVmaXhPZihwYXRoKQotCQkJCQkJfHwgKCFwYXRoLmlzQWJzb2x1dGUoKSAmJiBNRVRBREFUQURJUi5lcXVhbHMocGF0aC5zZWdtZW50KDApKSkpIHsKLQkJCQkJaW50IGNudCA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZVBhdGgpOwotCQkJCQlpZiAoTUVUQURBVEFESVIuZXF1YWxzKHBhdGguc2VnbWVudChjbnQpKSkgewotCQkJCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU2VydmVyRGlyVW5kZXJSb290LCBNRVRBREFUQURJUikpfTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChwYXRoLmVxdWFscyhpbnN0YWxsRGlyUGF0aCkpCi0JCQkJCXJldHVybiBuZXcgSVN0YXR1cyBbXSB7Ci0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RJbnN0YWxsLAotCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpckluc3RhbGwsICIiKS50cmltKCkpKX07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJUGF0aCBwYXRoID0gdG9tY2F0U2VydmVyLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCQkJLy8gSWYgbm9uLWN1c3RvbSBpbnN0YW5jZSBkaXIgaXMgbm90IHRoZSBpbnN0YWxsIGFuZCBtZXRhZGF0YSBpc24ndCB0aGUgc2VsZWN0aW9uLCByZXR1cm4gZXJyb3IKLQkJCQlpZiAoIXBhdGguZXF1YWxzKGluc3RhbGxEaXJQYXRoKSAmJiAhc2VydmVyRGlyTWV0YWRhdGEuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU2VydmVyRGlyQ3VzdG9tTm90TWV0YWRhdGEsIAotCQkJCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJNZXRhZGF0YSwgIiIpLnRyaW0oKSkpfTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeQotCQkJZGlyID0gdG9tY2F0U2VydmVyLmdldERlcGxveURpcmVjdG9yeSgpOwotCQkJLy8gRGVwbG95IGRpcmVjdG9yeSBtdXN0IGJlIHNldAotCQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckRlcGxveURpck5vdFNwZWNpZmllZCl9OwotCQkJfQotCQl9Ci0JCS8vIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBzdWNjZXNzCi0JCXJldHVybiBzdXBlci5nZXRTYXZlU3RhdHVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodG9tY2F0U2VydmVyICE9IG51bGwpIHsKLQkJCS8vIFZhbGlkYXRlIGluc3RhbmNlIGRpcmVjdG9yeQotCQkJU3RyaW5nIGRpciA9IHRvbWNhdFNlcnZlci5nZXRJbnN0YW5jZURpcmVjdG9yeSgpOwotCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpcik7Ci0JCQkJLy8gTXVzdCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIHdvcmtzcGFjZSBsb2NhdGlvbgotCQkJCWlmIChkaXIubGVuZ3RoKCkgPT0gMCB8fCB3b3Jrc3BhY2VQYXRoLmVxdWFscyhwYXRoKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJJc1Jvb3QpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vIFVzZXIgc3BlY2lmaWVkIHZhbHVlIG1heSBub3QgYmUgdW5kZXIgdGhlICIubWV0YWRhdGEiIGZvbGRlciBvZiB0aGUgd29ya3NwYWNlIAotCQkJCWVsc2UgaWYgKHdvcmtzcGFjZVBhdGguaXNQcmVmaXhPZihwYXRoKQotCQkJCQkJfHwgKCFwYXRoLmlzQWJzb2x1dGUoKSAmJiBNRVRBREFUQURJUi5lcXVhbHMocGF0aC5zZWdtZW50KDApKSkpIHsKLQkJCQkJaW50IGNudCA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZVBhdGgpOwotCQkJCQlpZiAoTUVUQURBVEFESVIuZXF1YWxzKHBhdGguc2VnbWVudChjbnQpKSkgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU2VydmVyRGlyVW5kZXJSb290LCBNRVRBREFUQURJUikpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBhdGguZXF1YWxzKGluc3RhbGxEaXJQYXRoKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RJbnN0YWxsLAotCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpckluc3RhbGwsICIiKS50cmltKCkpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlQYXRoIHBhdGggPSB0b21jYXRTZXJ2ZXIuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJCQkvLyBJZiBub24tY3VzdG9tIGluc3RhbmNlIGRpciBpcyBub3QgdGhlIGluc3RhbGwgYW5kIG1ldGFkYXRhIGlzbid0IHRoZSBzZWxlY3Rpb24sIHJldHVybiBlcnJvcgotCQkJCWlmICghcGF0aC5lcXVhbHMoaW5zdGFsbERpclBhdGgpICYmICFzZXJ2ZXJEaXJNZXRhZGF0YS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RNZXRhZGF0YSwgCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2VydmVyRGlyTWV0YWRhdGEsICIiKS50cmltKCkpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeQotCQkJZGlyID0gdG9tY2F0U2VydmVyLmdldERlcGxveURpcmVjdG9yeSgpOwotCQkJLy8gRGVwbG95IGRpcmVjdG9yeSBtdXN0IGJlIHNldAotCQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yRGVwbG95RGlyTm90U3BlY2lmaWVkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gQWxsIGlzIG9rYXksIGNsZWFyIGFueSBwcmV2aW91cyBlcnJvcgotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1dlYk1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTBhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0vKioKLSAqIERpYWxvZyB0byBhZGQgb3IgbW9kaWZ5IHdlYiBtb2R1bGVzLgotICovCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU0OwotCXByb3RlY3RlZCBXZWJNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3Q7Ci0JcHJvdGVjdGVkIFRleHQgZG9jQmFzZTsKLQlwcm90ZWN0ZWQgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyMjsKLQlwcm90ZWN0ZWQgSVRvbWNhdFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBUYWJsZSBwcm9qVGFibGU7Ci0KLQkvKioKLQkgKiBXZWJNb2R1bGVEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIyIGEgc2VydmVyCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gY29uZmlnIGEgVG9tY2F0IHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcjIsIElUb21jYXRTZXJ2ZXIgc2VydmVyLCBJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWcsIFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5zZXJ2ZXIyID0gc2VydmVyMjsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpc0VkaXQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdlYk1vZHVsZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlcjIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBjb25maWcgYSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaXNQcm9qZWN0IHRydWUgaWYgaXQgaXMgYSBwcm9qZWN0Ci0JICovCi0JcHVibGljIFdlYk1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyMiwgSVRvbWNhdFNlcnZlciBzZXJ2ZXIsIElUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1Byb2plY3QpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgc2VydmVyMiwgc2VydmVyLCBjb25maWcsIG5ldyBXZWJNb2R1bGUoIi8iLCAiIiwgbnVsbCwgdHJ1ZSkpOwotCQlpc0VkaXQgPSBmYWxzZTsKLQkJdGhpcy5pc1Byb2plY3QgPSBpc1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCWlmIChpc0VkaXQpCi0JCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUVkaXQpOwotCQllbHNlCi0JCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUFkZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgCi0JICogb2YgdGhpcyBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aAotCSAqIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPRyk7Ci0JCS8vIGFkZCBwcm9qZWN0IGZpZWxkIGlmIHdlIGFyZSBhZGRpbmcgYSBwcm9qZWN0Ci0JCWlmICghaXNFZGl0ICYmIGlzUHJvamVjdCkgewotCQkJTGFiZWwgbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWwuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUHJvamVjdHMpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlwcm9qVGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJcHJvalRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aHMuc2V0SGVscChwcm9qVGFibGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QUk9KRUNUKTsKLQkKLQkJCS8vIGZpbGwgdGFibGUgd2l0aCB3ZWIgbW9kdWxlIHByb2plY3RzCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlcjIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJTW9kdWxlIG1vZHVsZTMgPSBtb2R1bGVzW2ldOwotCQkJCQlpZiAoImpzdC53ZWIiLmVxdWFscyhtb2R1bGUzLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZTMgfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwcm9qVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCQlpdGVtLnNldFRleHQoMCwgbGFiZWxQcm92aWRlci5nZXRUZXh0KG1vZHVsZTMpKTsKLQkJCQkJCQlpdGVtLnNldEltYWdlKDAsIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobW9kdWxlMykpOwotCQkJCQkJCWl0ZW0uc2V0RGF0YShtb2R1bGUzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAiKTsKLQkJfQotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ0RvY3VtZW50QmFzZSk7Ci0JCWRvY0Jhc2UgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRvY0Jhc2Uuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZG9jQmFzZS5zZXRUZXh0KG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCXdocy5zZXRIZWxwKGRvY0Jhc2UsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19ET0NCQVNFKTsKLQkKLQkJLy8gZGlzYWJsZSBkb2N1bWVudCBiYXNlIGZvciBwcm9qZWN0IG1vZHVsZXMKLQkJaWYgKGlzUHJvamVjdCB8fCAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKSkKLQkJCWRvY0Jhc2Uuc2V0RWRpdGFibGUoZmFsc2UpOwotCQllbHNlIHsKLQkJCWRvY0Jhc2UuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIGRvY0Jhc2UuZ2V0VGV4dCgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCi0JCWlmIChpc0VkaXQgfHwgaXNQcm9qZWN0KQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAiKTsKLQkJZWxzZSB7Ci0JCQlCdXR0b24gYnJvd3NlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWJyb3dzZS5zZXRUZXh0KE1lc3NhZ2VzLmJyb3dzZSk7Ci0JCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeSk7Ci0JCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCQkJZG9jQmFzZS5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLy8gcGF0aCAoY29udGV4dC1yb290KQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aCk7Ci0JCWZpbmFsIFRleHQgcGF0aCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcGF0aC5zZXRUZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQkvKmlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQlwYXRoLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZWxzZSovCi0JCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLmdldFRleHQoKSwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCX0KLQkJCX0pOwotCQl3aHMuc2V0SGVscChwYXRoLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUEFUSCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiIik7Ci0JCQotCQlpZiAoIWlzUHJvamVjdCkgewotCQkJLy8gYXV0byByZWxvYWQKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCIiKTsKLQkJCWZpbmFsIEJ1dHRvbiByZWxvYWRhYmxlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlyZWxvYWRhYmxlLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJcmVsb2FkYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcmVsb2FkYWJsZS5zZXRTZWxlY3Rpb24obW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCXJlbG9hZGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgbW9kdWxlLmdldE1lbWVudG8oKSwgcmVsb2FkYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChyZWxvYWRhYmxlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUkVMT0FEKTsKLQkJfQotCQkKLQkJaWYgKCFpc0VkaXQgJiYgaXNQcm9qZWN0KSB7Ci0JCQlwcm9qVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGUgbW9kdWxlMyA9IChJTW9kdWxlKSBwcm9qVGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0RGF0YSgpOwotCQkJCQkJSVdlYk1vZHVsZSBtb2R1bGUyID0gKElXZWJNb2R1bGUpIG1vZHVsZTMubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUyLmdldENvbnRleHRSb290KCk7Ci0JCQkJCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCQkJCQljb250ZXh0Um9vdCA9ICIvIiArIGNvbnRleHRSb290OwotCQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0Um9vdCwgbW9kdWxlMy5nZXROYW1lKCksIG1vZHVsZTMuZ2V0SWQoKSwgbW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCQkJCWRvY0Jhc2Uuc2V0VGV4dChtb2R1bGUzLmdldE5hbWUoKSk7Ci0JCQkJCQlwYXRoLnNldFRleHQoY29udGV4dFJvb3QpOwotCQkJCQkJbW9kdWxlNCA9IG1vZHVsZTM7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiIpOwotCQl9Ci0JCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWJvb2xlYW4gb2sgPSB0cnVlOwotCQlpZiAobW9kdWxlLmdldERvY3VtZW50QmFzZSgpID09IG51bGwgfHwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLmxlbmd0aCgpIDwgMSkKLQkJCW9rID0gZmFsc2U7Ci0JCQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChvayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtaW1lIG1hcHBpbmcuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LldlYk1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGUgZ2V0V2ViTW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMWIyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWlfMy4wLjAuamFyCi1zamF2YXVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0N2Q2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ4MzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWE0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRmViIDIzIDIxOjE1OjQ5IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2FkMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDMucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4xMDAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMWIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMzU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXBwY2xpZW50X21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYzMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1YzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lamJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU5Zjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbmV3X3Rlc3RjYXNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY5M2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIwZjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3J1bnRpbWVfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3J1bnRpbWVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19ydW50aW1lX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld190ZXN0X3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld190ZXN0X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Yzg3NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfdGVzdF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQwZjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SmF2YSBTZXJ2ZXIgVUkgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWNsYXNzcGF0aENvbnRhaW5lcj1TZXJ2ZXIgUnVudGltZQotCi1jYWN0dXNKVW5pdENsaWVudD1KVW5pdCBDbGllbnQKLWNhY3R1c1NlcnZsZXRUZXN0Q2FzZT1TZXJ2bGV0IFRlc3QgQ2FzZQotY2FjdHVzUXVpY2tGaXhQcm9jZXNzb3I9Q2FjdHVzIFF1aWNrIEZpeCBQcm9jZXNzb3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIxNDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC53ZWIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5lamIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5lamIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5lYXIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5lYXIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2Vhci5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmFwcGNsaWVudCIKLSAgICAgICAgdHlwZUlkcz0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvYXBwY2xpZW50X21vZHVsZS5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvbm5lY3RvciIKLSAgICAgICAgdHlwZUlkcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51dGlsaXR5IgotICAgICAgICB0eXBlSWRzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gICAgIDxjbGllbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLmNsaWVudCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzLkpVbml0Q2xpZW50RGVsZWdhdGUiCi0gICAgICAgIGxhdW5jaGFibGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLmxhdW5jaGFibGUiCi0gICAgICAgIG5hbWU9IiVjYWN0dXNKVW5pdENsaWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgPHdpemFyZAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkIgotICAgICAgICBjYW5GaW5pc2hFYXJseT0iZmFsc2UiCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YS9vcmcuZWNsaXBzZS5qZHQuanVuaXQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1cy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmQiCi0gICAgICAgIGhhc1BhZ2VzPSJ0cnVlIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmIgotICAgICAgICBuYW1lPSIlY2FjdHVzU2VydmxldFRlc3RDYXNlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5jbGFzc3BhdGhDb250YWluZXJQYWdlIj4KLSAgICA8Y2xhc3NwYXRoQ29udGFpbmVyUGFnZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuY29udGFpbmVyIgotICAgICAgIG5hbWU9IiVjbGFzc3BhdGhDb250YWluZXIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSI+Ci0gICAgPC9jbGFzc3BhdGhDb250YWluZXJQYWdlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIvPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgICAgPHR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5xdWlja0ZpeFByb2Nlc3NvcnMiPgotICAgIDxxdWlja0ZpeFByb2Nlc3NvcgotICAgICAgIG5hbWU9IiVjYWN0dXNRdWlja0ZpeFByb2Nlc3NvciIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IiCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzLkNhY3R1c1F1aWNrRml4UHJvY2Vzc29yIj4KLSAgICA8L3F1aWNrRml4UHJvY2Vzc29yPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJjMGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmp2cnQwMDAwIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MWIyYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEVEX0pSRV9QUkVGRVJFTkNFX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiOwotCXByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKLQlwcm90ZWN0ZWQgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKLQkKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JCi0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBpbnN0YWxsRGlyOwotCXByb3RlY3RlZCBDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgTGlzdDxJVk1JbnN0YWxsPiBpbnN0YWxsZWRKUkVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBqcmVOYW1lczsKLQotCS8qKgotCSAqIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy5ydW50aW1lVHlwZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWl9SVU5USU1FX1RZUEUpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0JCX0KLQkJCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSByb290IGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuUlVOVElNRV9DT01QT1NJVEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnJ1bnRpbWVUeXBlTmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQluYW1lID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnJ1bnRpbWVUeXBlTG9jYXRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlpbnN0YWxsRGlyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaW5zdGFsbERpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpbnN0YWxsRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXRMb2NhdGlvbihuZXcgUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlCdXR0b24gYnJvd3NlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMuYnJvd3NlKTsKLQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhHZW5lcmljUnVudGltZUNvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb24pOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGluc3RhbGxEaXIuZ2V0VGV4dCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJCQlpbnN0YWxsRGlyLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXVwZGF0ZUpSRXMoKTsKLQkJCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZVR5cGVKUkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhqcmVOYW1lcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgc2VsID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IG51bGw7Ci0JCQkJaWYgKHNlbCA+IDApCi0JCQkJCXZtSW5zdGFsbCA9IGluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOwotCQkJCQotCQkJCXJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMucnVudGltZVR5cGVJbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQotCQluYW1lLmZvcmNlRm9jdXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJLy8gZ2V0IGFsbCBpbnN0YWxsZWQgSlZNcwotCQlpbnN0YWxsZWRKUkVzID0gbmV3IEFycmF5TGlzdDxJVk1JbnN0YWxsPigpOwotCQlJVk1JbnN0YWxsVHlwZVtdIHZtSW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLQkJZm9yIChJVk1JbnN0YWxsVHlwZSB2aXQgOiB2bUluc3RhbGxUeXBlcykgewotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2aXQuZ2V0Vk1JbnN0YWxscygpOwotCQkJZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpCi0JCQkJaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsKTsKLQkJfQotCQkKLQkJLy8gZ2V0IG5hbWVzCi0JCWludCBzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVmYXVsdEpSRTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpKzFdID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5WTVByZWZlcmVuY2VQYWdlIjsKLQkJCi0JCS8vIHNob3VsZCBiZSB1c2luZyB0aGUgZm9sbG93aW5nIEFQSSwgYnV0IGl0IG9ubHkgYWxsb3dzIGEgc2luZ2xlIHByZWZlcmVuY2UgcGFnZSBpbnN0YW5jZS4KLQkJLy8gc2VlIGJ1ZyAxNjgyMTEgZm9yIGRldGFpbHMKLQkJLy9QcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGlkIH0sIG51bGwpOwotCQkvL3JldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwkJCi0JCQotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZShpZCk7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaGVsbCgpLCBtYW5hZ2VyMik7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKGluc3RhbGxEaXIgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQluYW1lLnNldFRleHQocnVudGltZVdDLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWluc3RhbGxEaXIuc2V0VGV4dChydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQllbHNlCi0JCQlpbnN0YWxsRGlyLnNldFRleHQoIiIpOwotCQkKLQkJLy8gc2V0IHNlbGVjdGlvbgotCQlpZiAoKChHZW5lcmljUnVudGltZSlydW50aW1lKS5pc1VzaW5nRGVmYXVsdEpSRSgpKQotCQkJY29tYm8uc2VsZWN0KDApOwotCQllbHNlIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWludCBzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQkJaWYgKHZtSW5zdGFsbC5lcXVhbHMocnVudGltZS5nZXRWTUluc3RhbGwoKSkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkgKyAxKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZVdDLnZhbGlkYXRlKG51bGwpOwotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCWVsc2UKLQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE3NDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgR2VuZXJpY1J1bnRpbWVDb21wb3NpdGUgY29tcDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIEdlbmVyaWNSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2hhc0NvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2NyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUsIElXaXphcmRIYW5kbGUpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJY29tcCA9IG5ldyBHZW5lcmljUnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjaXNDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCi0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZS52YWxpZGF0ZShudWxsKTsKLQkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2VudGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCWNvbXAuc2V0UnVudGltZShydW50aW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWVlZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGltYWdlIHJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlUmVzb3VyY2UgewotCS8vIHRoZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8vIG1hcCBvZiBpbWFnZSBkZXNjcmlwdG9ycyBzaW5jZSB0aGVzZQotCS8vIHdpbGwgYmUgbG9zdCBieSB0aGUgaW1hZ2UgcmVnaXN0cnkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+IGltYWdlRGVzY3JpcHRvcnM7Ci0KLQkvLyBiYXNlIHVybHMgZm9yIGltYWdlcwotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoU3VmZml4ID0gImljb25zLyI7Ci0JCQlJQ09OX0JBU0VfVVJMID0gSmF2YVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2V0IGljb24gYmFzZSBVUkwiLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWl9SVU5USU1FX1RZUEUgPSAid2l6X3J1bnRpbWVUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laX0NBQ1RVU19URVNUID0gIndpel9jYWN0dXNfdGVzdCI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgewotCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laX1JVTlRJTUVfVFlQRSwgVVJMX1dJWkJBTiArICJuZXdfcnVudGltZV93aXoucG5nIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWl9DQUNUVVNfVEVTVCwgVVJMX1dJWkJBTiArICJuZXdfdGVzdF93aXoucG5nIik7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlKFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaWQpOwotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UgIiArIGtleSArICIgZnJvbSAiICsgcGFydGlhbFVSTCwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0phdmFTZXJ2ZXJVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0phdmFTZXJ2ZXJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFmNzY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9KYXZhU2VydmVyVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciB0b29saW5nIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEphdmFTZXJ2ZXJVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8qKgotCSAqIEphdmEgc2VydmVyIFVJIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVNlcnZlclVJUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YVNlcnZlclVJUGx1Z2luLgotCSAqLwotCXB1YmxpYyBKYXZhU2VydmVyVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLkphdmFTZXJ2ZXJVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVNlcnZlclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJJbnRlcm5hbCBlcnJvciIsIHQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrQmVuY2hXaW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdvcmtCZW5jaFdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrQmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2ggd29ya0JlbmNoPSBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya0JlbmNoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdvcmtCZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NiYzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZUxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlSW5zdGFsbGVkSlJFczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZURlZmF1bHRKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnRlcm5hbENhY3R1czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJSdW50aW1lTGlzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoVGVzdEFjdGlvbl9tZXNzYWdlX3NlbGVjdFJ1bkNvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVRpdGxlTWlzc2luZ0xpYnJhcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlQ3JlYXRlT2ZFbGVtZW50RmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VTZWVFcnJvckxvZzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTZWxlY3RBV2ViUHJvamVjdDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ1RpdGxlV2ViUHJvamVjdFJlcXVpcmVkOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0VtcHR5OwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NEb2VzTm90RXhpc3Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc0lzSW50ZXJmYWNlOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NOb3RTZXJ2bGV0VGVzdENhc2U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ291bGRudEluc3RhbGxMaWJyYXJpZXM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlRGVzdERpck5vdEZvdW5kOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0Vycm9yTWVzc2FnZUluc3RhbGxhdGlvbk9mTGlic0ZhaWxlZDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsRGlyTm90Rm91bmQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfQWRkaXRpb25hbEluZm9BZGRDYWN0dXNMaWJyYXJpZXM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRGlzcGxheVN0cmluZ0FkZENhY3R1c0xpYnM7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGUxOTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ydW50aW1lVHlwZVRpdGxlPUdlbmVyaWMgSjJFRSBSdW50aW1lCi1ydW50aW1lVHlwZURlc2NyaXB0aW9uPURlZmluZSBhIGdlbmVyaWMgSjJFRSBydW50aW1lLiBTcGVjaWZ5IGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgamFyIGZpbGVzIHRvIGNvbXBpbGUgYWdhaW5zdC4KLXJ1bnRpbWVUeXBlTmFtZT1OYSZtZToKLXJ1bnRpbWVUeXBlTG9jYXRpb249JkxvY2F0aW9uOgotYnJvd3NlPUImcm93c2UuLi4KLXJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb249U2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcnVudGltZS4KLXJ1bnRpbWVUeXBlSlJFPSZKUkU6Ci1ydW50aW1lVHlwZURlZmF1bHRKUkU9V29ya2JlbmNoIGRlZmF1bHQgSlJFCi1ydW50aW1lVHlwZUluc3RhbGxlZEpSRXM9SW4mc3RhbGxlZCBKUkVzLi4uCi0KLWNsYXNzcGF0aENvbnRhaW5lcj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb249U2VsZWN0IGEgc2VydmVyIHJ1bnRpbWUgdG8gYWRkIHRvIHRoZSBjbGFzc3BhdGgKLWNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0PVNlbGVjdCBhICZydW50aW1lIHRvIGFkZCB0byB0aGUgY2xhc3NwYXRoOgotCi1lcnJvckludGVybmFsQ2FjdHVzPUludGVybmFsIGVycm9yIHdoaWxlIGF0dGVtcHRpbmcgdG8gbGF1bmNoIENhY3R1cwotCi1MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlY3QgYSBUZXN0IENvbmZpZ3VyYXRpb24KLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb249U2VsZWN0IEpVbml0IGNvbmZpZ3VyYXRpb24gdG8gZGVidWcKLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RSdW5Db25maWd1cmF0aW9uPVNlbGVjdCBKVW5pdCBjb25maWd1cmF0aW9uIHRvIHJ1bgotCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2luZG93VGl0bGU9TmV3IENhY3R1cyBUZXN0IENhc2UKLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VUaXRsZU1pc3NpbmdMaWJyYXJ5PU1pc3NpbmcgbGlicmFyeQotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5PVlvdSBhcmUgbWlzc2luZyBjYWN0dXMgZGVwZW5kZW5jaWVzIGluIHlvdXIgd2ViIHByb2plY3QuIFdvdWxkIHlvdSBsaWtlIHRvIGluc3RhbGwgdGhlbT8KLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlTmV3PU5ldwotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVDcmVhdGVPZkVsZW1lbnRGYWlsZWQ9Q3JlYXRpb24gb2YgZWxlbWVudCBmYWlsZWQuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlU2VlRXJyb3JMb2c9U2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU2VsZWN0QVdlYlByb2plY3Q9V2FybmluZzogQ2FjdHVzIGxpYnJhcmllcyBjYW4gb25seSBiZSBpbnN0YWxsZWQgaW4gYSB3ZWIgcHJvamVjdC4gUGxlYXNlIHNlbGVjdCBhIHdlYiBwcm9qZWN0LgotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdUaXRsZVdlYlByb2plY3RSZXF1aXJlZD1XZWIgcHJvamVjdCByZXF1aXJlZC4KLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0VtcHR5PVN1cGVyY2xhc3MgaXMgZW1wdHkuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzRG9lc05vdEV4aXN0PVN1cGVyY2xhc3MgZG9lcyBub3QgZXhpc3QuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzSXNJbnRlcmZhY2U9U3VwZXJjbGFzcyBpcyBpbnRlcmZhY2UuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzTm90U2VydmxldFRlc3RDYXNlPVN1cGVyY2xhc3MgZG9lcyBub3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmNhY3R1cy5TZXJ2bGV0VGVzdENhc2UuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VDb3VsZG50SW5zdGFsbExpYnJhcmllcz1Db3VsZG4ndCBpbnN0YWxsIGxpYnJhcmllcwotQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQ9Q2FjdHVzIGJ1bmRsZSBjb3VsZCBub3QgYmUgZm91bmQuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VEZXN0RGlyTm90Rm91bmQ9RGVzdGluYXRpb24gZm9sZGVyIGRpZCBub3QgZXhpc3QuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsYXRpb25PZkxpYnNGYWlsZWQ9SW5zdGFsbGF0aW9uIG9mIGxpYnJhcmllcyBmYWlsZWQuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsRGlyTm90Rm91bmQ9Q2FjdHVzIGluc3RhbGwgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBmb3VuZAotQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfQWRkaXRpb25hbEluZm9BZGRDYWN0dXNMaWJyYXJpZXM9QWRkIHRoZSBDYWN0dXMgbGlicmFyaWVzIHRvIGRvIHRoZSBXRUItSU5GL2xpYiBkaXJlY3RvcnkKLUNhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0Rpc3BsYXlTdHJpbmdBZGRDYWN0dXNMaWJzPUFkZCBDYWN0dXMgTGlicmFyaWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJlMWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBTdXBwb3J0IGZvciBhbGwgc2VydmVyIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgewotCXByaXZhdGUgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmM7Ci0KLQlwdWJsaWMgUnVudGltZUxhYmVsUHJvdmlkZXIoZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMpIHsKLQkJdGhpcy5yYyA9IHJjOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiByYy5nZXRQcm9wZXJ0eSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmNsYXNzIH07Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCQlmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyA9IChJUnVudGltZUNvbXBvbmVudCkgYWRhcHRhYmxlOwotCQkJcmV0dXJuIG5ldyBSdW50aW1lTGFiZWxQcm92aWRlcihyYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTI5NjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0vKioKLSAqIFNXVCBVdGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgdGVzdENvbnRyb2wpIHsKLQkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYwotCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWUwYjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5SdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSB7Ci0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBzZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgTWFwPElSdW50aW1lLCBJQ2xhc3NwYXRoRW50cnk+IHJ1bnRpbWVNYXAgPSBuZXcgSGFzaE1hcDxJUnVudGltZSwgSUNsYXNzcGF0aEVudHJ5PigpOwotCi0JcHVibGljIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclBhZ2UoKSB7Ci0JCXN1cGVyKCJzZXJ2ZXIuY29udGFpbmVyIik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpfUlVOVElNRV9UWVBFKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lcik7Ci0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWZvciAoSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzKSB7Ci0JCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpIHsKLQkJCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBKYXZhU2VydmVyUGx1Z2luLmZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIocnVudGltZS5nZXRSdW50aW1lVHlwZSgpKTsKLQkJCQlpZiAocmNwdyAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIHNlcnZlckNvbnRhaW5lclBhdGggPSBuZXcgUGF0aChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLlNFUlZFUl9DT05UQUlORVIpCi0JCQkJCQkJLmFwcGVuZChyY3B3LmdldElkKCkpLmFwcGVuZChydW50aW1lLmdldElkKCkpOwotCQkJCQlydW50aW1lTWFwLnB1dChydW50aW1lLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShzZXJ2ZXJDb250YWluZXJQYXRoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSUNsYXNzcGF0aEVudHJ5IGNvbnRhaW5lckVudHJ5KSB7Ci0JCXNlbGVjdGlvbiA9IGNvbnRhaW5lckVudHJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0KTsKLQkJCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gcnVudGltZU1hcC5rZXlTZXQoKS50b0FycmF5KCk7IAotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJc2VsZWN0aW9uID0gcnVudGltZU1hcC5nZXQoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpICE9IDApCi0JCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU0ZjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlKYXZhU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQotCQlpZiAoIUphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVhN2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCXByaXZhdGUgZmluYWwgSUludm9jYXRpb25Db250ZXh0IGZDb250ZXh0OwotCi0JcHVibGljIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgamF2YUZpbGUgPSBmQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaW5zdGFsbExpYnJhcmllcyhqYXZhRmlsZS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxMaWJyYXJpZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmFwYWNoZS5jYWN0dXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVVSTCBjYWN0dXNMaWJEaXIgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoImxpYiIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNhY3R1c0xpYkRpciA9PSBudWxsKSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlSW5zdGFsbERpck5vdEZvdW5kKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlVUkwgbG9jYWxVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoY2FjdHVzTGliRGlyKTsKLQkJCWZpbmFsIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxVUkwuZ2V0UGF0aCgpKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJSVZpcnR1YWxGb2xkZXIgdmYgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcigiV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgSUNvbnRhaW5lciBkZXN0aW5hdGlvbkRpcmVjdG9yeSA9IHZmLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQotCQkJSUZvbGRlciBkZXN0aW5hdGlvbkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGRlc3RpbmF0aW9uRGlyZWN0b3J5Ci0JCQkJCS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCi0JCQlpZiAoZGVzdGluYXRpb25Gb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlGaWxlW10gZmlsZXNUb0NvcHkgPSBzb3VyY2VEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQkJU3RyaW5nW10gZmlsZXNUb0NvcHlOYW1lcyA9IG5ldyBTdHJpbmdbZmlsZXNUb0NvcHkubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzVG9Db3B5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbGVzVG9Db3B5TmFtZXNbaV0gPSBmaWxlc1RvQ29weVtpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbigKLQkJCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpKTsKLQkJCQlvcGVyYXRpb24uY29weUZpbGVzKGZpbGVzVG9Db3B5TmFtZXMsIGRlc3RpbmF0aW9uRm9sZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlRGVzdERpck5vdEZvdW5kKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQlzaG93SW5zdGFsbEZhaWxlZERpYWxvZyhNZXNzYWdlcy5DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsYXRpb25PZkxpYnNGYWlsZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93SW5zdGFsbEZhaWxlZERpYWxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihKYXZhU2VydmVyVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlNZXNzYWdlcy5DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VDb3VsZG50SW5zdGFsbExpYnJhcmllcywKLQkJCQltZXNzYWdlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChmQ29udGV4dC5nZXRTZWxlY3Rpb25PZmZzZXQoKSwgZkNvbnRleHQuZ2V0U2VsZWN0aW9uTGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkNhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0FkZGl0aW9uYWxJbmZvQWRkQ2FjdHVzTGlicmFyaWVzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRGlzcGxheVN0cmluZ0FkZENhY3R1c0xpYnM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NjA0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c1F1aWNrRml4UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklQcm9ibGVtTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDYWN0dXNRdWlja0ZpeFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb3JyZWN0aW9ucyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCBwcm9ibGVtSWQpIHsKLQkJcmV0dXJuIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kID09IHByb2JsZW1JZDsKLQl9Ci0KLQlwdWJsaWMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDb3JyZWN0aW9ucyhJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ2FjdHVzUHJvYmxlbShjb250ZXh0LCBsb2NhdGlvbnMpKQotCQkJcmV0dXJuIG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsKGNvbnRleHQpIH07Ci0JCQotCQlyZXR1cm4gbmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NhY3R1c1Byb2JsZW0oSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9ibGVtTG9jYXRpb24gbG9jYXRpb24gPSBsb2NhdGlvbnNbaV07Ci0JCQl0cnkgewotCQkJCVN0cmluZyBzID0gZ2V0U3RyaW5nVW50aWxXaGl0ZVNwYWNlT3JFbmQobG9jYXRpb24uZ2V0T2Zmc2V0KCksIHVuaXQpOwotCQkJCWlmICgiU2VydmxldFRlc3RDYXNlIi5lcXVhbHMocykgfHwgcy5pbmRleE9mKCJvcmcuYXBhY2hlLmNhY3R1cyIpID49IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdVbnRpbFdoaXRlU3BhY2VPckVuZChpbnQgb2Zmc2V0LCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSUJ1ZmZlciBidWZmZXIgPSB1bml0LmdldEJ1ZmZlcigpOwotCQlpbnQgbGVuZ3RoID0gYnVmZmVyLmdldExlbmd0aCgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gb2Zmc2V0OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJY2hhciBjID0gYnVmZmVyLmdldENoYXIoaW5kZXgpOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0JCQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJYnVpbGRlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9KVW5pdENsaWVudERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0pVbml0Q2xpZW50RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjOTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0pVbml0Q2xpZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRDbGllbnREZWxlZ2F0ZSBleHRlbmRzIENsaWVudERlbGVnYXRlIHsKLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQlDYWN0dXNMYXVuY2hhYmxlIGxhdW5jaGFibGUgPSAoQ2FjdHVzTGF1bmNoYWJsZSkgb2JqZWN0OwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBmaW5kTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hhYmxlLCBsYXVuY2hNb2RlKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVzdE5hbWUgPSBsYXVuY2hhYmxlLmdldFRlc3ROYW1lKCk7Ci0JCQl0ZXN0TmFtZSA9ICIiLmVxdWFscyh0ZXN0TmFtZSkgPyBsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKQotCQkJCQk6IGxhdW5jaGFibGUuZ2V0VGVzdENsYXNzTmFtZSgpICsgIi4iICsgdGVzdE5hbWUgKyAiKCkiOwotCQkJY29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvbihsYXVuY2hhYmxlLmdldFByb2plY3ROYW1lKCksIHRlc3ROYW1lLAotCQkJCQlsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKSwgIiIsIGxhdW5jaGFibGUuZ2V0VGVzdE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVVSTCB1cmwgPSBsYXVuY2hhYmxlLmdldENhY3R1c1VSTCgpOwotCQlTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnRvU3RyaW5nKCk7Ci0JCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi8iKSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZy5zdWJzdHJpbmcoMCwgdXJsU3RyaW5nLmxlbmd0aCgpIC0gMSkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5lcnJvckludGVybmFsQ2FjdHVzLCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weSA9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkJU3RyaW5nIHZtQXJnczsKLQkJCXZtQXJncyA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLCAiIik7Ci0JCQljb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsCi0JCQkJCXZtQXJncyArICIgLURjYWN0dXMuY29udGV4dFVSTD0iICsgdXJsLnRvU3RyaW5nKCkpOwotCQkJY29uZmlnID0gY29weS5kb1NhdmUoKTsKLQkJCURlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBsYXVuY2hNb2RlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5lcnJvckludGVybmFsQ2FjdHVzLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgcHJvamVjdE5hbWUsCi0JCQlTdHJpbmcgbmFtZSwgU3RyaW5nIG1haW5UeXBlLCBTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgdGVzdE5hbWUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gZ2V0SlVuaXRMYXVuY2hDb25maWdUeXBlKCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLAotCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKG5hbWUpKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgbWFpblR5cGUpOwotCQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkJd2Muc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0tFRVBSVU5OSU5HLCBmYWxzZSk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVEVTVF9DT05UQUlORVIsIGNvbnRhaW5lcik7Ci0JCQlpZiAodGVzdE5hbWUubGVuZ3RoKCkgPiAwKQotCQkJCXdjLnNldEF0dHJpYnV0ZShKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9URVNUX01FVEhPRF9OQU1FLCB0ZXN0TmFtZSk7Ci0JCQljb25maWcgPSB3Yy5kb1NhdmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBmaW5kTGF1bmNoQ29uZmlndXJhdGlvbihDYWN0dXNMYXVuY2hhYmxlIGxhdW5jaGFibGUsIFN0cmluZyBtb2RlKSB7Ci0JCVN0cmluZyB0ZXN0TmFtZSA9IGxhdW5jaGFibGUuZ2V0VGVzdE5hbWUoKTsKLQkJU3RyaW5nIHRlc3RDbGFzcyA9IGxhdW5jaGFibGUuZ2V0VGVzdENsYXNzTmFtZSgpOwotCQlTdHJpbmcgamF2YVByb2plY3ROYW1lID0gbGF1bmNoYWJsZS5nZXRQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgY29udGFpbmVyID0gIiI7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gZ2V0SlVuaXRMYXVuY2hDb25maWdUeXBlKCk7Ci0JCUxpc3Q8SUxhdW5jaENvbmZpZ3VyYXRpb24+IGNhbmRpZGF0ZUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElMYXVuY2hDb25maWd1cmF0aW9uPigpOwotCQl0cnkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoY29uZmlnVHlwZSk7Ci0JCQljYW5kaWRhdGVDb25maWdzID0gbmV3IEFycmF5TGlzdDxJTGF1bmNoQ29uZmlndXJhdGlvbj4oY29uZmlncy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCQkvLyB3ZSBzaG91bGQgcHJvYmFibHkgZXh0cmFjdCB0aGUgSlVuaXQgaW50ZXJuYWwgc3R1ZmYgYW5kCi0JCQkJLy8gY3JlYXRlIGEgbmV3IENhY3R1c0xhdW5jaENvbmZpZ3VyYXRpb24gaW5zdGVhZAotCQkJCWlmICgoY29uZmlnLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfQ09OVEFJTkVSLCAiIikuZXF1YWxzKGNvbnRhaW5lcikpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotCQkJCQkJCQkiIikuZXF1YWxzKHRlc3RDbGFzcykpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsICIiKS5lcXVhbHModGVzdE5hbWUpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkoY29uZmlnLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsCi0JCQkJCQkJCSIiKS5lcXVhbHMoamF2YVByb2plY3ROYW1lKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYW5kaWRhdGVDb25maWdzLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgY29uZmlncyBhc3NvY2lhdGVkIHdpdGggdGhlIElUeXBlLCBjcmVhdGUgb25lLgotCQkvLyBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBjb25maWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVHlwZSwgcmV0dXJuIGl0LgotCQkvLyBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29uZmlnIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVR5cGUsCi0JCS8vIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2Ugb25lLgotCQlpbnQgY2FuZGlkYXRlQ291bnQgPSBjYW5kaWRhdGVDb25maWdzLnNpemUoKTsKLQkJaWYgKGNhbmRpZGF0ZUNvdW50IDwgMSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChjYW5kaWRhdGVDb3VudCA9PSAxKQotCQkJcmV0dXJuIGNhbmRpZGF0ZUNvbmZpZ3MuZ2V0KDApOwotCQllbHNlIHsKLQkJCS8vIFByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBjb25maWcuIEEgbnVsbCByZXN1bHQgbWVhbnMgdGhlIHVzZXIKLQkJCS8vIGNhbmNlbGxlZCB0aGUgZGlhbG9nLCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCwKLQkJCS8vIHNpbmNlIGNhbmNlbGxpbmcgdGhlIGRpYWxvZyBzaG91bGQgYWxzbyBjYW5jZWwgbGF1bmNoaW5nIGFueXRoaW5nLgotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gY2hvb3NlQ29uZmlndXJhdGlvbihjYW5kaWRhdGVDb25maWdzLCBtb2RlKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29uZmlnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjaG9vc2VDb25maWd1cmF0aW9uKExpc3QgY29uZmlnTGlzdCwgU3RyaW5nIG1vZGUpIHsKLQkJSURlYnVnTW9kZWxQcmVzZW50YXRpb24gbGFiZWxQcm92aWRlciA9IERlYnVnVUlUb29scwotCQkJCS5uZXdEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQlKYXZhU2VydmVyVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhjb25maWdMaXN0LnRvQXJyYXkoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0Q29uZmlndXJhdGlvbik7Ci0JCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSkKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb24pOwotCQllbHNlCi0JCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0UnVuQ29uZmlndXJhdGlvbik7Ci0JCQotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCQkJcmV0dXJuIChJTGF1bmNoQ29uZmlndXJhdGlvbikgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGdldEpVbml0TGF1bmNoQ29uZmlnVHlwZSgpIHsKLQkJLy8gbWlnaHQgd2FudCB0byByZXBsYWNlIHRoaXMgd2l0aCBhIGN1c3RvbSBsYXVuY2ggY29uZmlndXJhdGlvbiBpbnN0ZWFkCi0JCUlMYXVuY2hNYW5hZ2VyIGxtID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJcmV0dXJuIGxtLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCJvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoY29uZmlnIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gbGF1bmNoYWJsZSBpbnN0YW5jZW9mIENhY3R1c0xhdW5jaGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL05ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZlMDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5qdW5pdC53aXphcmRzLk5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuanVuaXQud2l6YXJkcy5OZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd287Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJDTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0xBU1NFU19UT19DSEVDSyA9IHsKLQkJCSJvcmcuYXBhY2hlLmNhY3R1cy5TZXJ2bGV0VGVzdENhc2UiLCAianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIiwgIm9yZy5hc3BlY3RqLmxhbmcuSm9pblBvaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkib3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudCIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVFVSVJFRF9MSUJSQVJJRVMgPSB7Ci0JCQkiY2FjdHVzLTEuNy4yLmphciIsICJqdW5pdC0zLjguMS5qYXIiLCAiYXNwZWN0anJ0LTEuMi4xLmphciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkiY29tbW9ucy1sb2dnaW5nLTEuMC40LmphciIsICJjb21tb25zLWh0dHBjbGllbnQtMi4wLjIuamFyIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSVdvcmtiZW5jaCBmV29ya2JlbmNoOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd28gZlBhZ2UyOwotCi0JcHJpdmF0ZSBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VPbmUgZlBhZ2UxOwotCi0JcHVibGljIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dpbmRvd1RpdGxlKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laX0NBQ1RVU19URVNUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCWZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWZQYWdlMiA9IG5ldyBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd28oKTsKLQkJZlBhZ2UxID0gbmV3IENhY3R1c1BhZ2UxKGZQYWdlMik7Ci0JCWFkZFBhZ2UoZlBhZ2UxKTsKLQkJZlBhZ2UxLmluaXQoZ2V0U2VsZWN0aW9uKCkpOwotCQlhZGRQYWdlKGZQYWdlMik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDYWN0dXNQYWdlMSBleHRlbmRzIE5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZSB7Ci0JCXByaXZhdGUgQnV0dG9uIGZCZWdpbkJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBmRW5kQnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIGZCZWdpblhYWEJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBmRW5kWFhYQnV0dG9uOwotCi0JCXByaXZhdGUgQ29tcG9zaXRlIGZDYWN0dXNCdXR0b25Db21wb3NpdGU7Ci0KLQkJcHVibGljIENhY3R1c1BhZ2UxKE5ld1Rlc3RDYXNlV2l6YXJkUGFnZVR3byBwYWdlMikgewotCQkJc3VwZXIocGFnZTIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyLmluaXQoc2VsZWN0aW9uKTsKLQkJCXZhbGlkYXRlSWZKVW5pdFByb2plY3QoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJc2V0U3VwZXJDbGFzcyhTVVBFUkNMQVNTX05BTUUsIHRydWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlSlVuaXQ0Q29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IG5Db2x1bW5zKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHN1cGVyQ2xhc3NDaGFuZ2VkKCkgewotCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gZ2V0U3VwZXJDbGFzcygpOwotCQkJaWYgKHN1cGVyQ2xhc3NOYW1lID09IG51bGwgfHwgc3VwZXJDbGFzc05hbWUudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc0lzRW1wdHksIG51bGwpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0KLQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSIpKSB7Ci0JCQkJLy9TaG9ydC1jaXJjdWl0IGlmIHRoaXMgSVMgU2VydmxldFRlc3RDYXNlCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0KLQkJCWlmIChnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgIT0gbnVsbCkgewotCQkJCUlUeXBlIHR5cGU7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IHJlc29sdmVDbGFzc05hbWVUb1R5cGUoZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldEphdmFQcm9qZWN0KCksCi0JCQkJCQkJZ2V0UGFja2FnZUZyYWdtZW50KCksIHN1cGVyQ2xhc3NOYW1lKTsKLQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCQkJSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzRG9lc05vdEV4aXN0LAotCQkJCQkJCQludWxsKTsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQotCQkJCQlpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJCU1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0ludGVyZmFjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQl9Ci0KLQkJCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQkJCQlJVHlwZVtdIHN1cGVyVHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChzdXBlclR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscygKLQkJCQkJCQkJIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSIpKSB7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc05vdFNlcnZsZXRUZXN0Q2FzZSwKLQkJCQkJCQludWxsKTsKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXByaXZhdGUgSVR5cGUgcmVzb2x2ZUNsYXNzTmFtZVRvVHlwZShJSmF2YVByb2plY3QganByb2plY3QsIElQYWNrYWdlRnJhZ21lbnQgcGFjaywKLQkJCQlTdHJpbmcgY2xhc3NUb1Rlc3ROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkJSVR5cGUgdHlwZSA9IGpwcm9qZWN0LmZpbmRUeXBlKGNsYXNzVG9UZXN0TmFtZSk7Ci0KLQkJCS8vIHNlYXJjaCBpbiBjdXJyZW50IHBhY2thZ2UKLQkJCWlmICh0eXBlID09IG51bGwgJiYgcGFjayAhPSBudWxsICYmICFwYWNrLmlzRGVmYXVsdFBhY2thZ2UoKSkgewotCQkJCXR5cGUgPSBqcHJvamVjdC5maW5kVHlwZShwYWNrLmdldEVsZW1lbnROYW1lKCksIGNsYXNzVG9UZXN0TmFtZSk7Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBpbiBqYXZhLmxhbmcKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQl0eXBlID0ganByb2plY3QuZmluZFR5cGUoImphdmEubGFuZyIsIGNsYXNzVG9UZXN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVJZkpVbml0UHJvamVjdCgpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNoZWNrRm9yV2ViUHJvamVjdCgpKSB7Ci0JCQkJCWNoZWNrRm9yQ2FjdHVzTGlicmFyaWVzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVNlbGVjdEFXZWJQcm9qZWN0OwotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGdldFNoZWxsKCksCi0JCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdUaXRsZVdlYlByb2plY3RSZXF1aXJlZCwKLQkJCQkJCQltc2cpOwotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLAotCQkJCQkJIkZhaWxlZCB0byBjaGVjayBmb3IgY2FjdHVzIGxpYnJhcmllcy4iLCBlKTsKLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUeXBlTWVtYmVycyhJVHlwZSB0eXBlLCBJbXBvcnRzTWFuYWdlciBpbXBvcnRzLAotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3VwZXIuY3JlYXRlVHlwZU1lbWJlcnModHlwZSwgaW1wb3J0cywgbW9uaXRvcik7Ci0JCQlpZiAoZkJlZ2luQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2VuZXJhdGVCZWdpbk1ldGhvZCh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQotCQkJaWYgKGZFbmRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlnZW5lcmF0ZUVuZE1ldGhvZCh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQotCQkJaWYgKGZCZWdpblhYWEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdlbmVyYXRlQmVnaW5YWFhNZXRob2RzKHR5cGUsIGltcG9ydHMpOwotCQkJfQotCi0JCQlpZiAoZkVuZFhYWEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdlbmVyYXRlRW5kWFhYTWV0aG9kcyh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUJlZ2luTWV0aG9kKElUeXBlIHR5cGUsIEltcG9ydHNNYW5hZ2VyIGltcG9ydHMpCi0JCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlTdHJpbmdCdWZmZXIgbWV0aG9kQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgYmVnaW4oIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoIm9yZy5hcGFjaGUuY2FjdHVzLldlYlJlcXVlc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiByZXF1ZXN0KSB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoImphdmEubGFuZy5FeGNlcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiB7XG5cblx0fSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZS5jcmVhdGVNZXRob2QobWV0aG9kQnVmZmVyLnRvU3RyaW5nKCksIG51bGwsIGZhbHNlLCBudWxsKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVuZE1ldGhvZChJVHlwZSB0eXBlLCBJbXBvcnRzTWFuYWdlciBpbXBvcnRzKQotCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJU3RyaW5nQnVmZmVyIG1ldGhvZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoInB1YmxpYyB2b2lkIGVuZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChpbXBvcnRzLmFkZEltcG9ydCgib3JnLmFwYWNoZS5jYWN0dXMuV2ViUmVxdWVzdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHJlcXVlc3QpIHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChpbXBvcnRzLmFkZEltcG9ydCgiamF2YS5sYW5nLkV4Y2VwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHtcblxuXHR9ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0eXBlLmNyZWF0ZU1ldGhvZChtZXRob2RCdWZmZXIudG9TdHJpbmcoKSwgbnVsbCwgZmFsc2UsIG51bGwpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQmVnaW5YWFhNZXRob2RzKElUeXBlIHR5cGUsIEltcG9ydHNNYW5hZ2VyIGltcG9ydHMpCi0JCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlnZW5lcmF0ZVhYWE1ldGhvZHModHlwZSwgaW1wb3J0cywgImJlZ2luIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVhYWE1ldGhvZHMoSVR5cGUgdHlwZSwgSW1wb3J0c01hbmFnZXIgaW1wb3J0cywgU3RyaW5nIHByZWZpeCkKLQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCUlNZXRob2RbXSB0ZXN0TWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0TWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCUlNZXRob2QgdGVzdE1ldGhvZCA9IHRlc3RNZXRob2RzW2ldOwotCQkJCVN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IHRlc3RNZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlpZiAodGVzdE1ldGhvZE5hbWUuc3RhcnRzV2l0aCgidGVzdCIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlTdHJpbmcgbmV3TWV0aG9kTmFtZSA9IHByZWZpeCArIHRlc3RNZXRob2ROYW1lLnN1YnN0cmluZyg0KTsKLQkJCQkJU3RyaW5nQnVmZmVyIG1ldGhvZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChuZXdNZXRob2ROYW1lKTsKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoIm9yZy5hcGFjaGUuY2FjdHVzLldlYlJlcXVlc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHJlcXVlc3QpIHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltZXRob2RCdWZmZXIuYXBwZW5kKGltcG9ydHMuYWRkSW1wb3J0KCJqYXZhLmxhbmcuRXhjZXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiB7XG5cblx0fSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChtZXRob2RCdWZmZXIudG9TdHJpbmcoKSwgdGVzdE1ldGhvZCwgZmFsc2UsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVuZFhYWE1ldGhvZHMoSVR5cGUgdHlwZSwgSW1wb3J0c01hbmFnZXIgaW1wb3J0cykKLQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCWdlbmVyYXRlWFhYTWV0aG9kcyh0eXBlLCBpbXBvcnRzLCAiZW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1ldGhvZFN0dWJTZWxlY3Rpb25Db250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgbkNvbHVtbnMpIHsKLQkJCXN1cGVyLmNyZWF0ZU1ldGhvZFN0dWJTZWxlY3Rpb25Db250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQkJCWNyZWF0ZUVtcHR5U3BhY2UoY29tcG9zaXRlKTsKLQkJCWZDYWN0dXNCdXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWZDYWN0dXNCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJZkJlZ2luQnV0dG9uID0gY3JlYXRlU2VsZWN0aW9uQnV0dG9uKCJiZWdpbigpIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZFbmRCdXR0b24gPSBjcmVhdGVTZWxlY3Rpb25CdXR0b24oImVuZCgpIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZCZWdpblhYWEJ1dHRvbiA9IGNyZWF0ZVNlbGVjdGlvbkJ1dHRvbigKLQkJCQkJImJlZ2luWFhYKCkgbWV0aG9kcyIsIGZDYWN0dXNCdXR0b25Db21wb3NpdGUpOyAvLyROT04tTkxTLTEkCi0JCQlmRW5kWFhYQnV0dG9uID0gY3JlYXRlU2VsZWN0aW9uQnV0dG9uKCJlbmRYWFgoKSBtZXRob2RzIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVNlbGVjdGlvbkJ1dHRvbihTdHJpbmcgdGV4dCwgQ29tcG9zaXRlIGdyb3VwKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQkJYnV0dG9uLnNldEZvbnQoZ3JvdXAuZ2V0Rm9udCgpKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbnRyb2wgY3JlYXRlRW1wdHlTcGFjZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVFbXB0eVNwYWNlKHBhcmVudCwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udHJvbCBjcmVhdGVFbXB0eVNwYWNlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWdkLndpZHRoSGludCA9IDA7Ci0JCWdkLmhlaWdodEhpbnQgPSAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ZvcldlYlByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBmUGFnZTEuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZmFjZXRzID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZmFjZXRzLmhhc05leHQoKSkgewotCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBmYWNldHMubmV4dCgpOwotCQkJCWlmIChmYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscygianN0LndlYiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yQ2FjdHVzTGlicmFyaWVzKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZlBhZ2UxLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKTsKLQotCQlMaXN0PFN0cmluZz4gbWlzc2luZ0xpYnJhcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDTEFTU0VTX1RPX0NIRUNLLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoQ0xBU1NFU19UT19DSEVDS1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQltaXNzaW5nTGlicmFyaWVzLmFkZChSRVFVSVJFRF9MSUJSQVJJRVNbaV0pOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1pc3NpbmdMaWJyYXJpZXMuc2l6ZSgpID4gMCkgewotCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLAotCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVRpdGxlTWlzc2luZ0xpYnJhcnksCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ0xpYnJhcnksCi0JCQkJCQkJCW1pc3NpbmdMaWJyYXJpZXMudG9BcnJheSgpKSkpIHsKLQkJCQkJQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWwuaW5zdGFsbExpYnJhcmllcyhwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSmF2YVNlcnZlclVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmIChmaW5pc2hQYWdlKGZQYWdlMS5nZXRSdW5uYWJsZSgpKSkgewotCQkJSVR5cGUgbmV3Q2xhc3MgPSBmUGFnZTEuZ2V0Q3JlYXRlZFR5cGUoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbmV3Q2xhc3MuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGZXb3JrYmVuY2gKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQkJb3BlblJlc291cmNlKHJlc291cmNlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2hQYWdlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoZ2V0Q29udGFpbmVyKCksIG9wLAotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JUaXRsZU5ldzsgLy8gTmV3SlVuaXRXaXphcmRfb3BfZXJyb3JfdGl0bGUKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVDcmVhdGVPZkVsZW1lbnRGYWlsZWQ7IC8vIE5ld0pVbml0V2l6YXJkX29wX2Vycm9yX21lc3NhZ2UKLQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIGUuZ2V0TWVzc2FnZSgpLCBnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheU1lc3NhZ2VEaWFsb2coVGhyb3dhYmxlIHQsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlLAotCQkJU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbXNnLndyaXRlKG1lc3NhZ2UpOwotCQkJbXNnLndyaXRlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsIHx8IGV4Y2VwdGlvbk1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCW1zZy53cml0ZShNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlU2VlRXJyb3JMb2cpOwotCQllbHNlCi0JCQltc2cud3JpdGUoZXhjZXB0aW9uTWVzc2FnZSk7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCAoSUZpbGUpIHJlc291cmNlLCB0cnVlKTsKLQkJCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gSmF2YVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLQkJCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZmZiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi0qLnhtbAotdGVtcC5mb2xkZXIKLXdlYnNwaGVyZWNvcmUuamFyCi13ZWJzcGhlcmVjb3Jlc3JjLnppcAotamF2YUNvbXBpbGVyLndlYnNwaGVyZWNvcmUuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZjIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M4MWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE2IDIzOjIyOjE0IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzlkNzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSmFuIDIxIDE0OjUxOjE3IEVFVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZjYThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI1N1biBBcHIgMTYgMjM6MjI6MDAgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTEKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjBmYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDEucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiB3ZWJzcGhlcmVjb3JlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS5Db3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA1LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzdjMDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzZXJ2ZXJkZWYvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHdlYnNwaGVyZWNvcmUuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gd2Vic3BoZXJlY29yZS5qYXIKLXNvdXJjZS53ZWJzcGhlcmVjb3JlLmphciA9IHNyYy8KLW91dHB1dC53ZWJzcGhlcmVjb3JlLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9pY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2ljb25zL29iajE2L3dlYnNwaGVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2ljb25zL29iajE2L3dlYnNwaGVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTY4MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGx1Z2luTmFtZT0gV2ViU3BoZXJlIEdlbmVyaWMgU2VydmVyIERlZmluaXRpb24gQ29yZSBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIHNlcnZlciBkZWZpbml0aW9uIElCTSBXZWJTcGhlcmUgYXBwbGljYXRpb24gc2VydmVyCi1nZW5lcmljQ2F0ZWdvcnk9SUJNCi0KLSMgPT09PT09PT09PT09IHdlYnNwaGVyZSA9PT09PT09PT09PT09PT09PT09PQotd2Vic3BoZXJlLjYucnVudGltZS5uYW1lPUlCTSBXZWJTcGhlcmUgdjYuMAotd2Vic3BoZXJlLjYucnVudGltZS5kZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkKLXdlYnNwaGVyZS42LnNlcnZlci5uYW1lPUlCTSBXZWJTcGhlcmUgdjYuMAotd2Vic3BoZXJlLjYuc2VydmVyLmRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIDEuNCBtb2R1bGVzIG9uIGEgbG9jYWwgc2VydmVyLiBcCi1Qcm92aWRlcyBiYXNpYyBzZXJ2ZXIgZnVuY3Rpb25hbGl0eQotCi13YXNIb21lPUlCTSBXZWJTcGhlcmUgSW5zdGFsbGF0aW9uIERpcmVjdG9yeToKLXBvcnQ9UG9ydDoKLXdhc1Byb2ZpbGU9U2VydmVyIFByb2ZpbGUgRGlyZWN0b3J5Ogotd2FzQ2VsbD1DZWxsOgotd2FzTm9kZT1Ob2RlOgotd2FzU2VydmVyPVNlcnZlcjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWNkZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IgotICAgICAgIG5hbWU9IiV3ZWJzcGhlcmUuNi5ydW50aW1lLm5hbWUiCi0gICAgICAgZGVzY3JpcHRpb249IiV3ZWJzcGhlcmUuNi5ydW50aW1lLmRlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWdlbmVyaWNDYXRlZ29yeSIKLSAgICAgICB2ZXJzaW9uPSI2LjAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40Ii8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4xLCAyLjAsIDIuMSIvPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbnM9IjEuMiwgMS4zLCAxLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkJICAgc3RhcnRUaW1lb3V0PSIzMDAwMDAiCi0gICAgICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IgotICAgICAgICAgICBkZXNjcmlwdGlvbj0iJXdlYnNwaGVyZS42LnNlcnZlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgbmFtZT0iJXdlYnNwaGVyZS42LnNlcnZlci5uYW1lIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1ZyIKLSAgICAgICAgICAgc3RhcnRCZWZvcmVQdWJsaXNoPSJ0cnVlIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotCTwvZXh0ZW5zaW9uPgotCi08IS0tIFVJIENvbXBvbmVudHMtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0gICAgIDxmcmFnbWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiIC8+Ci0gICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3dlYnNwaGVyZS5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUuNiIvPgotCTwvZXh0ZW5zaW9uPgotICAKLTwhLS0gU2VydmVyIHR5cGUgZGVmaW5pdGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IiBkZWZpbml0aW9uZmlsZT0iL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYiPgotCQk8L3NlcnZlcmRlZmluaXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuZ2VuZXJpY3B1Ymxpc2hlciI+Ci0gICAgICA8Z2VuZXJpY3B1Ymxpc2hlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUuQW50UHVibGlzaGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWJzcGhlcmUuYW50cHVibGlzaGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIj4KLSAgICA8L3J1bnRpbWUtY29tcG9uZW50LXR5cGU+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIKLSAgICAgICB2ZXJzaW9uPSI2LjAiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIgotICAgICAgICAgdmVyc2lvbj0iNi4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPiAgCi0gICAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgIDwvc3VwcG9ydGVkPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiCi0gICAgICBwYXRoPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzFjZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi9zY3JpcHRzL3dlYnNwaGVyZS42LngueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImRlcGxveWV4dGVuc2lvbiIgIGRlZmF1bHQ9ImRlcGxveS5qMmVlLndlYiIgIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9Indhcy5ob21lIiB2YWx1ZT0iJHt3YXNIb21lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2R1bGUud29ya2luZy5kaXIiIHZhbHVlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7cHJvamVjdC5uYW1lfSI+PC9wcm9wZXJ0eT4KLQk8cGF0aCBpZD0idG9vbHBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7d2FzLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHt3YXMuaG9tZX0vbGliL3Byb3BlcnRpZXMiIC8+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke3dhcy5ob21lfS9vcHRpb25hbExpYnJhcmllcy9qeXRob24uamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIGNsYXNzcGF0aHJlZj0idG9vbHBhdGgiIG5hbWU9IndzYWRtaW4iIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzQWRtaW4iIC8+Ci0JPHRhc2tkZWYgY2xhc3NwYXRocmVmPSJ0b29scGF0aCIgbmFtZT0id3NlamJkZXBsb3kiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzRWpiRGVwbG95IiAvPgkKLQk8dGFza2RlZiBjbGFzc3BhdGhyZWY9InRvb2xwYXRoIiBuYW1lPSJ3c2luc3RhbGxhcHAiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLkluc3RhbGxBcHBsaWNhdGlvbiIgLz4JCi0KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxlY2hvIG1lc3NhZ2U9Ik1vZHVsZSBXb3JraW5nIERheSAgJHttb2R1bGUud29ya2luZy5kaXJ9IFByb2plY3QgV29ya2luZyBEaXI9JHtwcm9qZWN0LndvcmtpbmcuZGlyfSBNZXNzYWdlIERpcj0ke21vZHVsZS5kaXJ9IE1vZHVsZSBOYW1lICR7bW9kdWxlLm5hbWV9Ij48L2VjaG8+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLndvcmtpbmcuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAJCi0JCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCWNvbW1hbmQ9IiRBZG1pbkFwcCB1bmluc3RhbGwgJHttb2R1bGUubmFtZX0iIAotCQkJZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJPC93c2FkbWluPgotCSAgICA8d3NhZG1pbiAgCi0JCQl3YXNob21lPSIke3dhcy5ob21lfSIgCQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLWNvbnRleHRyb290ICAke2NvbnRleHRSb290fSAtdXNlZGVmYXVsdGJpbmRpbmdzfSIgCi0JCQlmYWlsb25lcnJvcj0idHJ1ZSI+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+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvd2Vic3BoZXJlL2NvcmUvQW50UHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5wdWJsaXNoZXJzLkFudFB1Ymxpc2hlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2Vic3BoZXJlLmFudHB1Ymxpc2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIHNldHVwQW50TGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjKSB7Ci0JCVN0cmluZyB3YXNQcm9maWxlID0gKFN0cmluZyl0aGlzLmdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQoIndhc1Byb2ZpbGUiKTsKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywiLUR1c2VyLmluc3RhbGwucm9vdD0iK3dhc1Byb2ZpbGUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjEzNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLkNvcmVQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjNDZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9uaXRvcmNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQxZTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLW1vbml0b3Jjb3JlLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZV8zLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNzBlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvZGVidWc9dHJ1ZQotCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3BhcnNpbmc9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMjM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNlMjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEZlYiAyMyAyMToxNjoyMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAzLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlZDU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gbW9uaXRvcmNvcmUvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQWNjZXB0VGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTExYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQWNjZXB0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci0vKioKLSAqIFRoZSBhY3R1YWwgVENQL0lQIG1vbml0b3Jpbmcgc2VydmVyLiBUaGlzIGlzIGEgdGhyZWFkIHRoYXQKLSAqIGxpc3RlbnMgb24gYSBwb3J0IGFuZCByZWxheXMgYSBjYWxsIHRvIGFub3RoZXIgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXB0VGhyZWFkIHsKLQlwcm90ZWN0ZWQgSU1vbml0b3IgbW9uaXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGFsaXZlID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKLQotCXByb3RlY3RlZCBUaHJlYWQgdGhyZWFkOwotCi0JY2xhc3MgU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHVibGljIFNlcnZlclRocmVhZCgpIHsKLQkJCXN1cGVyKCJUQ1AvSVAgTW9uaXRvciIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNlcnZlclRocmVhZCBhY2NlcHRzIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIHByb3RvY29sCi0JCSAqIGFkYXB0ZXIgdG8gZGVhbCB3aXRoIHRoZSBjb25uZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IHNlcnZlciBzb2NrZXQKLQkJCXRyeSB7Ci0JCQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChtb25pdG9yLmdldExvY2FsUG9ydCgpKTsKLQkJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk1vbml0b3JpbmcgbG9jYWxob3N0OiIgKyBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiAtPiAiICsgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCkKLQkJCQkJCSsgIjoiICsgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc3RhcnQgbW9uaXRvcmluZyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJd2hpbGUgKGFsaXZlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gYWNjZXB0IHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGNsaWVudAotCQkJCQlTb2NrZXQgbG9jYWxTb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJCQotCQkJCQlpbnQgdGltZW91dCA9IG1vbml0b3IuZ2V0VGltZW91dCgpOwotCQkJCQlpZiAodGltZW91dCAhPSAwKQotCQkJCQkJbG9jYWxTb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIKLQkJCQkJCVNvY2tldCByZW1vdGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQkJCQlpZiAodGltZW91dCAhPSAwKQotCQkJCQkJCXJlbW90ZVNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0JCQkJCQkKLQkJCQkJCXJlbW90ZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpLCB0aW1lb3V0KTsKLQkJCQkJCQotCQkJCQkJLy8gcmVsYXkgdGhlIGNhbGwgdGhyb3VnaAotCQkJCQkJU3RyaW5nIHByb3RvY29sSWQgPSBtb25pdG9yLmdldFByb3RvY29sKCk7Ci0JCQkJCQlQcm90b2NvbEFkYXB0ZXIgYWRhcHRlciA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm90b2NvbEFkYXB0ZXIocHJvdG9jb2xJZCk7Ci0JCQkJCQlhZGFwdGVyLmNvbm5lY3QobW9uaXRvciwgbG9jYWxTb2NrZXQsIHJlbW90ZVNvY2tldCk7Ci0JCQkJCX0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkQ29ubmVjdGlvblRocmVhZCB0aHJlYWQyID0gbmV3IEZhaWxlZENvbm5lY3Rpb25UaHJlYWQoKE1vbml0b3IpIG1vbml0b3IsIGxvY2FsU29ja2V0LCBNZXNzYWdlcy5lcnJvckNvbm5lY3RUaW1lb3V0KTsKLQkJCQkJCXRocmVhZDIuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZENvbm5lY3Rpb25UaHJlYWQgdGhyZWFkMiA9IG5ldyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkKChNb25pdG9yKSBtb25pdG9yLCBsb2NhbFNvY2tldCwgbnVsbCk7Ci0JCQkJCQl0aHJlYWQyLnN0YXJ0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChhbGl2ZSkKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIG1vbml0b3JpbmciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBY2NlcHRUaHJlYWQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICovCi0JcHVibGljIEFjY2VwdFRocmVhZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7Ci0JCWlmICh0aHJlYWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhyZWFkID0gbmV3IFNlcnZlclRocmVhZCgpOwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQlUaHJlYWQueWllbGQoKTsKLQkJCi0JCS8vIHdhaXQgdXAgdG8gMiBzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbgotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzZXJ2ZXJTb2NrZXQgPT0gbnVsbCAmJiBpIDwgMTApIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaSsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiAodGhyZWFkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgc2h1dCBkb3duIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCWFsaXZlID0gZmFsc2U7Ci0JCQl0aHJlYWQgPSBudWxsOwotCQkJCi0JCQlTdHJpbmcgcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJICAgUHJvdG9jb2xBZGFwdGVyIGFkYXB0ZXIgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvdG9jb2xBZGFwdGVyKHByb3RvY29sSWQpOwotCQkJYWRhcHRlci5kaXNjb25uZWN0KG1vbml0b3IpOwotCQkJaWYgKHNlcnZlclNvY2tldCAhPSBudWxsKQotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RvcHBpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcG9ydCBpcyBpbiB1c2UuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoaW50IHBvcnQpIHsKLQkJU2VydmVyU29ja2V0IHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZmYjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBTb2NrZXQgaW47Ci0JcHJvdGVjdGVkIFNvY2tldCBvdXQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbiBpbmJvdW5kIHNvY2tldAotCSAqIEBwYXJhbSBvdXQgb3V0Ym91bmQgc29ja2V0Ci0JICovCi0JcHVibGljIENvbm5lY3Rpb24oU29ja2V0IGluLCBTb2NrZXQgb3V0KSB7Ci0JCXRoaXMuaW4gPSBpbjsKLQkJdGhpcy5vdXQgPSBvdXQ7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNsb3NpbmcgY29ubmVjdGlvbiIpOwotCQl0cnkgewotCQkJaW4uZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKLQkJCWluLnNodXRkb3duSW5wdXQoKTsKLQkJCWluLnNodXRkb3duT3V0cHV0KCk7Ci0JCQkKLQkJCW91dC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOwotCQkJb3V0LnNodXRkb3duSW5wdXQoKTsKLQkJCW91dC5zaHV0ZG93bk91dHB1dCgpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ29ubmVjdGlvbiBjbG9zZWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uICIgKyB0aGlzLCBleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTY0Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50RmlsdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7Ci0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0JCi0JcHJvdGVjdGVkIENvbnRlbnRGaWx0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBvcmRlciBmb3IgdGhpcyBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIKLQkgKi8gCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyB0aGUgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICogQHBhcmFtIGlzUmVxdWVzdCB0cnVlIGlmIHJlcXVlc3QsIGZhbHNlIGlmIHJlc3BvbnNlCi0JICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQKLQkgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBjb250ZW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gcHJvYmxlbQotCSAqLwotCXB1YmxpYyBieXRlW10gZmlsdGVyKFJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiBpc1JlcXVlc3QsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChDb250ZW50RmlsdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50IGZpbHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOwotCQkJCXJldHVybiBuZXcgYnl0ZVswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGUuZmlsdGVyKHJlcXVlc3QsIGlzUmVxdWVzdCwgY29udGVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ0NTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0ZhaWxlZENvbm5lY3Rpb25UaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi0vKioKLSAqIFRocmVhZCB1c2VkIGlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgZmFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKLQlwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOwotCXByb3RlY3RlZCBTb2NrZXQgc29ja2V0OwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3I7Ci0KLQlwdWJsaWMgRmFpbGVkQ29ubmVjdGlvblRocmVhZChNb25pdG9yIG1vbml0b3IsIFNvY2tldCBzb2NrZXQsIFN0cmluZyBlcnJvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLnNvY2tldCA9IHNvY2tldDsKLQkJdGhpcy5lcnJvciA9IGVycm9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QobW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJU3RyaW5nIGVyciA9IGVycm9yOwotCQlpZiAoZXJyID09IG51bGwpCi0JCQllcnIgPSBNZXNzYWdlcy5lcnJvckNvbm5lY3RUb1NlcnZlcjsKLQkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGVyci5nZXRCeXRlcygpKTsKLQkJCi0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtCVUZGRVJdOwotCQkJd2hpbGUgKGluLmF2YWlsYWJsZSgpID4gMCkgewotCQkJCWludCBuID0gaW4ucmVhZChiKTsKLQkJCQlieXRlW10gYyA9IG5ldyBieXRlW25dOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYywgMCwgbik7Ci0JCQkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc29ja2V0LnNodXRkb3duSW5wdXQoKTsKLQkJCQlzb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JQ29udGVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM3YmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBIGNvbnRlbnQgZmlsdGVyIHRoYXQgZmlsdGVycyBzcGVjaWZpYyBjb250ZW50cyBmcm9tIHRoZSBtb25pdG9yIHRyYWZmaWMKLSAqIG9mIGEgcmVxdWVzdC4gCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RmlsdGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZpbHRlci4KLQkgKiBFYWNoIGZpbHRlciBoYXMgYSBkaXN0aW5jdCwgZml4ZWQgaWQuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7Ci0JICogdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgKHRyYW5zbGF0ZWQpIG5hbWUgZm9yIHRoaXMgZmlsdGVyLgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoaXMgZmlsdGVyLgotCSAqIEVhY2ggZmlsdGVyIGhhcyBhIHJlbGF0aXZlIG9yZGVyIHRoYXQgYWxsb3dzIHRoZW0gdG8gYmUgYXBwbGllZCBpbiB0aGUgY29ycmVjdAotCSAqIG9yZGVyIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIExvd2VyIG9yZGVycyBhcmUgcHJvY2Vzc2VkIGZpcnN0LgotCSAqCi0JICogQHJldHVybiB0aGUgcmVsYXRpdmUgb3JkZXIKLQkgKiAKLQkgKiBbaXNzdWU6IENTIC0gVGhlIHNjaGVtYSAoY29udGVudEZpbHRlcm5zLmV4c2QpIGRlZmluZXMgYW4gJ29yZGVyJyBhdHRyaWJ1dGUuICAKLQkgKiBUaGUgY29tbWVudHMgYWJvdmUgc3VnZ2VzdCB0aGF0IGZpbHRlcnMgc2hvdWxkIGJlIGRlc2lnbmVkIHRvIGJlIGNvbXBvc2FibGUuICBJcyB0aGlzIGNvcnJlY3Q/ICAKLQkgKiBJdCB3b3VsZCBiZSBnb29kIHRvIG1ha2UgdGhpcyBvcHRpb25hbCBpZiB0aGUgdXNlciBoYWQgbm8gaWRlYSBob3cgaGlzIGZpbHRlciBzaG91bGQgYmUgb3JkZXJlZC4KLQkgKiBJJ3ZlIGZvdW5kIHRoYXQgc29tZXRpbWVzICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnIGFyZSBhZGVxdWF0ZSB0byBoYW5kbGUgb3JkZXJpbmcgaXNzdWVzIGFuZCBhcmUgCi0JICogZWFzaWVyIGZvciB0aGUgZXh0ZW5zaW9uIHdyaXRlciBkZWFsIHdpdGggYW5kIGdldCBhIHNlbnNlIG9mIHRoZSBwcm9wZXIgdmFsdWUgdG8gYXNzaWduLiBdCi0JICovCi0JLy9wdWJsaWMgaW50IGdldE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBGaWx0ZXIgdGhlIGdpdmVuIGNvbnRlbnQgZnJvbSB0aGUgZ2l2ZW4gcmVxdWVzdC4gVGhlIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBmaWx0ZXJlZCBvdXQgd2lsbCAKLQkgKiBub3QgYmUgc2hvd24gdG8gY2xpZW50cyBvZiB0aGUgVENQL0lQIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgcGVyZm9ybWVkIG9uCi0JICogQHBhcmFtIGlzUmVxdWVzdCBzZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCBmaWx0ZXIgYXBwbGllcyB0byByZXF1ZXN0IG1vbml0b3IgdHJhZmZpYywKLQkgKiAgICBvciBzZXQgdG8gZmFsc2UgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gdGhlIHJlc3BvbnNlIG1vbml0b3IgdHJhZmZpYwotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBtZXNzYWdlIGNvbnRlbnQgdG8gYmUgZmlsdGVyZWQgb3V0Ci0JICogQHJldHVybiB0aGUgZmlsdGVyZWQgY29udGVudAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcGFyc2luZyBvciBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGZpbHRlcihSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNSZXF1ZXN0LCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTVmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYSBib29sZWFuCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTgzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVByb3RvY29sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEEgcHJvdG9jb2wgYWRhcHRlciBlbmFibGVzIGEgbW9uaXRvciB0byBzdXBwb3J0IGEgcGFydGljdWxhciBuZXR3b3JrCi0gKiBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gQWxsIHN1cHBvcnRlZAotICogcHJvdG9jb2xzIHdpbGwgYmUgYmFzZWQgb24gVENQL0lQLgotICogPHA+Ci0gKiBQcm90b2NvbCBhZGFwdGVycyBhcmUgcmVnaXN0ZXJlZCB2aWEgdGhlIDxjb2RlPnByb3RvY29sQWRhcGF0ZXJzPC9jb2RlPgotICogZXh0ZW5zaW9uIHBvaW50IGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9jb2RlPgotICogcGx1Zy1pbi4gVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHByb3RvY29sIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSB2aWEKLSAqIHtAbGluayBNb25pdG9yUGx1Z2luI2dldFByb3RvY29sQWRhcHRlcnMoKX0uIFN0YW5kYXJkIHByb3RvY29sCi0gKiBhZGFwdGVycyBmb3Ige0BsaW5rcGxhaW4gI0hUVFBfUFJPVE9DT0xfSUQgSFRUUH0gYW5kCi0gKiB7QGxpbmtwbGFpbiAjVENQSVBfUFJPVE9DT0xfSUQgVENQL0lQfSBhcmUgYnVpbHQtaW4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm90b2NvbEFkYXB0ZXIgewotCS8qKgotCSAqIFByb3RvY29sIGFkYXB0ZXIgaWQgKHZhbHVlIHtAdmFsdWV9KSBmb3IgVENQL0lQLgotCSAqIFRoZSBUQ1AvSVAgcHJvdG9jb2wgYWRhcHRlciBpcyBzdGFuZGFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ1BJUF9QUk9UT0NPTF9JRCA9ICJUQ1AvSVAiOwotCi0JLyoqCi0JICogUHJvdG9jb2wgYWRhcHRlciBpZCAodmFsdWUge0B2YWx1ZX0pIGZvciBIVFRQLgotCSAqIFRoZSBIVFRQIHByb3RvY29sIGFkYXB0ZXIgaXMgc3RhbmRhcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9QUk9UT0NPTF9JRCA9ICJIVFRQIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgYWRhcHRlci4KLQkgKiBFYWNoIGFkYXB0ZXIgaGFzIGEgZGlzdGluY3QsIGZpeGVkIGlkLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQKLQkgKiBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlICh0cmFuc2xhdGVkKSBuYW1lIGZvciB0aGlzIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTQxNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgdGhlIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50LgotICogUGx1Zy1pbnMgdGhhdCByZWdpc3RlciBhIHN0YXJ0dXAgZXh0ZW5zaW9uIHdpbGwgYmUgYWN0aXZhdGVkIHdoZW4gdGhlIG1vbml0b3IKLSAqIGNvcmUgcGx1Zy1pbiBpbml0aWFsaXplcyBhbmQgaGF2ZSBhbiBvcHBvcnR1bml0eSB0byBydW4gY29kZSB0aGF0IGNhbid0IGJlCi0gKiBpbXBsZW1lbnRlZCB1c2luZyB0aGUgbm9ybWFsIGNvbnRyaWJ1dGlvbiBtZWNoYW5pc21zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFydHVwIHsKLQkvKioKLQkgKiBXaWxsIGJlIGNhbGxlZCBvbiBtb25pdG9yIGNvcmUgc3RhcnR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0YWQ0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkTG9jYWxQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZFJlbW90ZVBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkUmVtb3RlSG9zdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUb1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vbml0b3JWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbnRlbnRTaXplOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOWMzZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0KLWVycm9yUG9ydEluVXNlPVRoZSBUQ1AvSVAgbW9uaXRvciBjb3VsZCBub3Qgc3RhcnQgYmVjYXVzZSBwb3J0IHswfSBpcyBpbiB1c2UuCi1lcnJvckludmFsaWRMb2NhbFBvcnQ9VGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlzIGludmFsaWQuCi1lcnJvckludmFsaWRSZW1vdGVQb3J0PVRoZSByZW1vdGUgcG9ydCBudW1iZXIgaXMgaW52YWxpZC4KLWVycm9ySW52YWxpZFJlbW90ZUhvc3Q9VGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgaW52YWxpZC4KLWVycm9yQ29ubmVjdFRvU2VydmVyPUVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIuCi1lcnJvckNvbm5lY3RUaW1lb3V0PUVycm9yOiBUaW1lb3V0IGNvbm5lY3RpbmcgdG8gc2VydmVyLgotZXJyb3JDb250ZW50U2l6ZT1UaGUgSFRUUCBjb250ZW50IGlzIHRvbyBsYXJnZSB0byBkaXNwbGF5LgotCi1tb25pdG9yVmFsaWQ9VGhlIG1vbml0b3IgaXMgdmFsaWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGJjMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3IgaW1wbGVtZW50cyBJTW9uaXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fSUQgPSAiaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX0xPQ0FMX1BPUlQgPSAibG9jYWwtcG9ydCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fUkVNT1RFX0hPU1QgPSAicmVtb3RlLWhvc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1JFTU9URV9QT1JUID0gInJlbW90ZS1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19UWVBFX0lEID0gInR5cGUtaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1RJTUVPVVQgPSAidGltZW91dCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fQVVUT19TVEFSVCA9ICJhdXRvLXN0YXJ0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7Ci0JcHJvdGVjdGVkIGludCByZW1vdGVQb3J0ID0gODA7Ci0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQgPSA4MDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7Ci0JcHJvdGVjdGVkIGludCB0aW1lb3V0OwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9TdGFydCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3Q8SVJlcXVlc3RMaXN0ZW5lcj4gcmVxdWVzdExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVJlcXVlc3RMaXN0ZW5lcj4oMik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvcigpIHsKLQkJcHJvdG9jb2xJZCA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlSG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewotCQlyZXR1cm4gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgewotCQlyZXR1cm4gcmVtb3RlUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0TG9jYWxQb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLQkJcmV0dXJuIGxvY2FsUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbElkOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNnZXRUaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7Ci0JCXJldHVybiB0aW1lb3V0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNpc0F1dG9TdGFydCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKSB7Ci0JCXJldHVybiBhdXRvU3RhcnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yI2lzUnVubmluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlpZiAoaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1J1bm5pbmcodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjZGVsZXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm47Ci0JCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTW9uaXRvcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb25pdG9yI2lzV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNjcmVhdGVXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIElNb25pdG9yV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBuZXcgTW9uaXRvcldvcmtpbmdDb3B5KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsKElNb25pdG9yIG1vbml0b3IpIHsKLQkJaWQgPSBtb25pdG9yLmdldElkKCk7Ci0JCXJlbW90ZUhvc3QgPSBtb25pdG9yLmdldFJlbW90ZUhvc3QoKTsKLQkJcmVtb3RlUG9ydCA9IG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpOwotCQlsb2NhbFBvcnQgPSBtb25pdG9yLmdldExvY2FsUG9ydCgpOwotCQlwcm90b2NvbElkID0gbW9uaXRvci5nZXRQcm90b2NvbCgpOwotCQl0aW1lb3V0ID0gbW9uaXRvci5nZXRUaW1lb3V0KCk7Ci0JCWF1dG9TdGFydCA9IG1vbml0b3IuaXNBdXRvU3RhcnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19JRCwgaWQpOwotCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX1RZUEVfSUQsIHByb3RvY29sSWQpOwotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19MT0NBTF9QT1JULCBsb2NhbFBvcnQpOwotCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX1JFTU9URV9IT1NULCByZW1vdGVIb3N0KTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKE1FTUVOVE9fUkVNT1RFX1BPUlQsIHJlbW90ZVBvcnQpOwotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19USU1FT1VULCB0aW1lb3V0KTsKLQkJbWVtZW50by5wdXRCb29sZWFuKE1FTUVOVE9fQVVUT19TVEFSVCwgYXV0b1N0YXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJaWQgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX0lEKTsKLQkJcHJvdG9jb2xJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fVFlQRV9JRCk7Ci0JCUludGVnZXIgdGVtcCA9IG1lbWVudG8uZ2V0SW50ZWdlcihNRU1FTlRPX0xPQ0FMX1BPUlQpOwotCQlpZiAodGVtcCAhPSBudWxsKQotCQkJbG9jYWxQb3J0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQlyZW1vdGVIb3N0ID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19SRU1PVEVfSE9TVCk7Ci0JCXRlbXAgPSBtZW1lbnRvLmdldEludGVnZXIoTUVNRU5UT19SRU1PVEVfUE9SVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQlyZW1vdGVQb3J0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQl0ZW1wID0gbWVtZW50by5nZXRJbnRlZ2VyKE1FTUVOVE9fVElNRU9VVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQl0aW1lb3V0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQlCb29sZWFuIHRlbXAyID0gbWVtZW50by5nZXRCb29sZWFuKE1FTUVOVE9fQVVUT19TVEFSVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQlhdXRvU3RhcnQgPSB0ZW1wMi5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNzdGFydCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNSdW5uaW5nKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkgfHwgIU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZXhpc3RzKHRoaXMpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydE1vbml0b3IodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3Ijc3RhcnQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAoaXNXb3JraW5nQ29weSgpIHx8ICFNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmV4aXN0cyh0aGlzKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJaWYgKCFpc1J1bm5pbmcoKSkKLQkJCXJldHVybjsKLQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdG9wTW9uaXRvcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWlmICghcmVxdWVzdExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXF1ZXN0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXF1ZXN0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSByZXF1ZXN0IGV2ZW50LgotCSAqIEBwYXJhbSBycgotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlcXVlc3RFdmVudChSZXF1ZXN0IHJyLCBpbnQgdHlwZSkgewotCQlpbnQgc2l6ZSA9IHJlcXVlc3RMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUmVxdWVzdExpc3RlbmVyW10gcmwgPSBuZXcgSVJlcXVlc3RMaXN0ZW5lcltzaXplXTsKLQkJcmVxdWVzdExpc3RlbmVycy50b0FycmF5KHJsKTsKLQkJCi0JCWZvciAoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lciA6IHJsKSB7Ci0JCQlpZiAodHlwZSA9PSBBREQpCi0JCQkJbGlzdGVuZXIucmVxdWVzdEFkZGVkKHRoaXMsIHJyKTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ0hBTkdFKQotCQkJCWxpc3RlbmVyLnJlcXVlc3RDaGFuZ2VkKHRoaXMsIHJyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBuZXcgcmVxdWVzdCByZXNwb25zZSBwYWlyLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IGEgcmVxdWVzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpcmVSZXF1ZXN0RXZlbnQocmVxdWVzdCwgQUREKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHJlcXVlc3QgcmVzcG9uc2UgcGFpciBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IGEgcmVxdWVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RDaGFuZ2VkKFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaXJlUmVxdWVzdEV2ZW50KHJlcXVlc3QsIENIQU5HRSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlpZiAobG9jYWxQb3J0IDwgMCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRMb2NhbFBvcnQsIG51bGwpOwotCQkKLQkJaWYgKHJlbW90ZVBvcnQgPCAwKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW52YWxpZFJlbW90ZVBvcnQsIG51bGwpOwotCQkKLQkJaWYgKHJlbW90ZUhvc3QgPT0gbnVsbCB8fCByZW1vdGVIb3N0Lmxlbmd0aCgpID09IDAgfHwgIWlzVmFsaWRIb3N0bmFtZShyZW1vdGVIb3N0KSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRSZW1vdGVIb3N0LCBudWxsKTsKLQkJCi0JCWlmIChpc0xvY2FsaG9zdChyZW1vdGVIb3N0KSAmJiBsb2NhbFBvcnQgPT0gcmVtb3RlUG9ydCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRMb2NhbFBvcnQsIG51bGwpOwotCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhvc3RuYW1lKFN0cmluZyBob3N0KSB7Ci0JCWlmIChob3N0ID09IG51bGwgfHwgaG9zdC50cmltKCkubGVuZ3RoKCkgPCAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IGxlbmd0aCA9IGhvc3QubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGhvc3QuY2hhckF0KGkpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpICYmIGMgIT0gJzonICYmIGMgIT0gJy4nICYmIGMgIT0gJy0nKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaG9zdC5lbmRzV2l0aCgiOiIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJaWYgKGhvc3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmICgibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCkgfHwgIjEyNy4wLjAuMSIuZXF1YWxzKGhvc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0YWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaWYgKGxvY2FsSG9zdGFkZHIuZ2V0SG9zdE5hbWUoKS5lcXVhbHMoaG9zdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY2hlY2tpbmcgZm9yIGxvY2FsaG9zdCIsIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb25pdG9yIFsiICsgZ2V0SWQoKSArICIsICIgKyBnZXRQcm90b2NvbCgpICsgIiwgIiArIGdldExvY2FsUG9ydCgpICsgIiwgIgotCQkJKyBnZXRSZW1vdGVIb3N0KCkgKyAiLCAiICsgZ2V0UmVtb3RlUG9ydCgpICsgIl0iOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vbml0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSU1vbml0b3IgbSA9IChJTW9uaXRvcikgb2JqOwotCQlpZiAobS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCW0gPSAoKElNb25pdG9yV29ya2luZ0NvcHkpIG0pLmdldE9yaWdpbmFsKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaWQgPT0gbnVsbCAmJiBtLmdldElkKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyhtLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGxvY2FsUG9ydCAhPSBtLmdldExvY2FsUG9ydCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVtb3RlUG9ydCAhPSBtLmdldFJlbW90ZVBvcnQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChyZW1vdGVIb3N0ID09IG51bGwgJiYgbS5nZXRSZW1vdGVIb3N0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlbW90ZUhvc3QgIT0gbnVsbCAmJiAhcmVtb3RlSG9zdC5lcXVhbHMobS5nZXRSZW1vdGVIb3N0KCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb3RvY29sSWQgPT0gbnVsbCAmJiBtLmdldFByb3RvY29sKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHByb3RvY29sSWQgIT0gbnVsbCAmJiAhcHJvdG9jb2xJZC5lcXVhbHMobS5nZXRQcm90b2NvbCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YzU1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvck1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCi0JLy8gbW9uaXRvcnMKLQlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvcj4gbW9uaXRvcnM7Ci0JcHJvdGVjdGVkIE1hcDxJTW9uaXRvciwgQWNjZXB0VGhyZWFkPiB0aHJlYWRzID0gbmV3IEhhc2hNYXA8SU1vbml0b3IsIEFjY2VwdFRocmVhZD4oKTsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvckxpc3RlbmVyPiBtb25pdG9yTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTW9uaXRvckxpc3RlbmVyPigpOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2w7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgTWFwPFJlcXVlc3QsIExpc3Q8UmVzZW5kSFRUUFJlcXVlc3Q+PiByZXNlbmRNYXAgPSBuZXcgSGFzaE1hcDxSZXF1ZXN0LCBMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0Pj4oKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwotCQotCXN0YXRpYyB7Ci0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5leGVjdXRlU3RhcnR1cHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNb25pdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IE1vbml0b3JNYW5hZ2VyKCk7Ci0JCQlpbnN0YW5jZS5zdGFydE1vbml0b3JzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb25pdG9yTWFuYWdlcigpIHsKLQkJbG9hZE1vbml0b3JzKCk7Ci0JCQotCQlwY2wgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKCJtb25pdG9ycyIpKSB7Ci0JCQkJCWxvYWRNb25pdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZU1vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTW9uaXRvcldvcmtpbmdDb3B5KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb25pdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1vbml0b3JzCi0JICovCi0JcHVibGljIExpc3Q8SU1vbml0b3I+IGdldE1vbml0b3JzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJTW9uaXRvcj4obW9uaXRvcnMpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCFtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSkKLQkJCW1vbml0b3JzLmFkZChtb25pdG9yKTsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBBREQpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSdW5uaW5nKElNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuICh0aHJlYWRzLmdldChtb25pdG9yKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBhIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKEFjY2VwdFRocmVhZC5pc1BvcnRJblVzZShtb25pdG9yLmdldExvY2FsUG9ydCgpKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLCBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiIpLCBudWxsKSk7Ci0JCQotCQlBY2NlcHRUaHJlYWQgdGhyZWFkID0gbmV3IEFjY2VwdFRocmVhZChtb25pdG9yKTsKLQkJdGhyZWFkLnN0YXJ0U2VydmVyKCk7Ci0JCXRocmVhZHMucHV0KG1vbml0b3IsIHRocmVhZCk7Ci0JfQotCQotCS8qKgotCSAqIFN0b3AgYSBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQotCQkJcmV0dXJuOwotCQkKLQkJQWNjZXB0VGhyZWFkIHRocmVhZCA9IHRocmVhZHMuZ2V0KG1vbml0b3IpOwotCQlpZiAodGhyZWFkICE9IG51bGwpIHsKLQkJCXRocmVhZC5zdG9wU2VydmVyKCk7Ci0JCQl0aHJlYWRzLnJlbW92ZShtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJc3RvcE1vbml0b3IobW9uaXRvcik7Ci0JCW1vbml0b3JzLnJlbW92ZShtb25pdG9yKTsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBSRU1PVkUpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBDSEFOR0UpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzKElNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIChtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBtb25pdG9yIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIW1vbml0b3JMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJbW9uaXRvckxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBtb25pdG9yIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobW9uaXRvckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQltb25pdG9yTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSBtb25pdG9yIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9uaXRvckV2ZW50KElNb25pdG9yIG1vbml0b3IsIGludCB0eXBlKSB7Ci0JCUlNb25pdG9yTGlzdGVuZXJbXSBvYmogPSBtb25pdG9yTGlzdGVuZXJzLnRvQXJyYXkobmV3IElNb25pdG9yTGlzdGVuZXJbbW9uaXRvckxpc3RlbmVycy5zaXplKCldKTsKLQkJCi0JCWZvciAoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IG9iaikgewotCQkJaWYgKHR5cGUgPT0gQUREKQotCQkJCWxpc3RlbmVyLm1vbml0b3JBZGRlZChtb25pdG9yKTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ0hBTkdFKQotCQkJCWxpc3RlbmVyLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpCi0JCQkJbGlzdGVuZXIubW9uaXRvclJlbW92ZWQobW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vbml0b3JzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vbml0b3JzIik7Ci0JCQotCQltb25pdG9ycyA9IG5ldyBBcnJheUxpc3Q8SU1vbml0b3I+KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoIm1vbml0b3JzIik7Ci0JCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkKLQkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJTW9uaXRvciBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQkJCQkJCW1vbml0b3IubG9hZChjaGlsZHJlbltpXSk7Ci0JCQkJCQltb25pdG9ycy5hZGQobW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb25pdG9ycyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7Ci0JCXRyeSB7Ci0JCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgibW9uaXRvcnMiKTsKLQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb25pdG9ycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1vbml0b3IgbW9uaXRvciA9IChNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb25pdG9yIik7Ci0JCQkJbW9uaXRvci5zYXZlKGNoaWxkKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHhtbFN0cmluZyA9IG1lbWVudG8uc2F2ZVRvU3RyaW5nKCk7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcHJlZnMuc2V0VmFsdWUoIm1vbml0b3JzIiwgeG1sU3RyaW5nKTsKLQkJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGJyb3dzZXJzIiwgZSk7Ci0JCX0KLQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZXNlbmQgcmVxdWVzdCBmcm9tIHRoZSBnaXZlbiByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50OyBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIG5ldyByZXNlbmQgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzZW5kSFRUUFJlcXVlc3QgY3JlYXRlUmVzZW5kUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdCgoTW9uaXRvcilyZXF1ZXN0LmdldE1vbml0b3IoKSwgcmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc2VuZCByZXF1ZXN0IHRvIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVzZW5kIHJlcXVlc3QgdG8gYWRkCi0JICogQHBhcmFtIHJlc2VuZFJlcSB0aGUgcmVzZW5kIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNlbmRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgUmVzZW5kSFRUUFJlcXVlc3QgcmVzZW5kUmVxKSB7Ci0JCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVzZW5kUmVxID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxpc3QgPSByZXNlbmRNYXAuZ2V0KHJlcXVlc3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PigpOwotCQkJcmVzZW5kTWFwLnB1dChyZXF1ZXN0LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChyZXNlbmRSZXEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdC4gCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gcmVzZW5kTWFwLmdldChyZXF1ZXN0KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJlc2VuZEhUVFBSZXF1ZXN0W2xpc3Quc2l6ZSgpXSk7Ci0JCQotCQlyZXR1cm4gbmV3IFJlc2VuZEhUVFBSZXF1ZXN0WzBdOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGFsbCBtb25pdG9ycyB0aGF0IGFyZSBzZXQgdG8gYXV0by1zdGFydC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnRNb25pdG9ycygpIHsKLQkJTW9uaXRvck1hbmFnZXIgbWFuYWdlciA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCUxpc3QgbW9uaXRvckxpc3QgPSBtYW5hZ2VyLmdldE1vbml0b3JzKCk7Ci0JCUl0ZXJhdG9yIG1vbml0b3JJdGVyYXRvciA9IG1vbml0b3JMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChtb25pdG9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBtb25pdG9ySXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1vbml0b3IuaXNBdXRvU3RhcnQoKSkKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnN0YXJ0KCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkZhaWxlZCB0byBzdGFydCBtb25pdG9yOiIgKyBtb25pdG9yLnRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzliMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBUaGUgbW9uaXRvciBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIFRoZSBwbHVnaW4vYnVuZGxlIGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIjsKLQotCXByaXZhdGUgc3RhdGljIE1vbml0b3JQbHVnaW4gc2luZ2xldG9uOwotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBQcm90b2NvbEFkYXB0ZXI+IHByb3RvY29sQWRhcHRlcnM7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPiBjb250ZW50RmlsdGVyczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHVwc0xvYWRlZDsKLQotCS8qKgotCSAqIE1vbml0b3JQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQkJbG9hZFByb3RvY29sQWRhcHRlcnMoKTsKLQkJbG9hZENvbnRlbnRGaWx0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLk1vbml0b3JQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vbml0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBwcm90b2NvbCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3RvY29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuICJIVFRQIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCBhZGFwdGVyIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcHJvdG9jb2wgYWRhcHRlcnMgKHtAbGluayAjZ2V0UHJvdG9jb2xBZGFwdGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhCi0JICogbWF0Y2hpbmcgaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHByb3RvY29sIGFkYXB0ZXIgaWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKLQkgKiAgIGlzIG5vIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgUHJvdG9jb2xBZGFwdGVyIGdldFByb3RvY29sQWRhcHRlcihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHByb3RvY29sQWRhcHRlcnMuZ2V0KGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogUHJvdG9jb2wgYWRhcHRlcnMgYXJlIHJlZ2lzdGVyZWQgdmlhIHRoZSA8Y29kZT5wcm90b2NvbEFkYXBhdGVyczwvY29kZT4KLQkgKiBleHRlbnNpb24gcG9pbnQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU8L2NvZGU+Ci0JICogcGx1Zy1pbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsOyBjbGllbnRzIG1heSBzYWZlbHkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBwcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBQcm90b2NvbEFkYXB0ZXJbXSBnZXRQcm90b2NvbEFkYXB0ZXJzKCkgewotCQlMaXN0PFByb3RvY29sQWRhcHRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xBZGFwdGVyPigpOwotCQlJdGVyYXRvcjxQcm90b2NvbEFkYXB0ZXI+IGl0ZXJhdG9yID0gcHJvdG9jb2xBZGFwdGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCVByb3RvY29sQWRhcHRlcltdIHR5cGVzID0gbmV3IFByb3RvY29sQWRhcHRlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh0eXBlcyk7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgZmlsdGVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRlbnQgZmlsdGVycwotCSAqLwotCXB1YmxpYyBJQ29udGVudEZpbHRlcltdIGdldENvbnRlbnRGaWx0ZXJzKCkgewotCQlMaXN0PElDb250ZW50RmlsdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ29udGVudEZpbHRlcj4oKTsKLQkJSXRlcmF0b3I8SUNvbnRlbnRGaWx0ZXI+IGl0ZXJhdG9yID0gY29udGVudEZpbHRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlJQ29udGVudEZpbHRlcltdIGNmID0gbmV3IElDb250ZW50RmlsdGVyW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNmKTsKLQkJcmV0dXJuIGNmOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBjb250ZW50IGZpbHRlciBieSB0aGUgaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiB0aGUgY29udGVudCBmaWx0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGZvdW5kCi0JICovCi0JcHVibGljIElDb250ZW50RmlsdGVyIGZpbmRDb250ZW50RmlsdGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGNvbnRlbnRGaWx0ZXJzLmdldChpZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQcm90b2NvbEFkYXB0ZXJzKCkgewotCQlpZiAocHJvdG9jb2xBZGFwdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHByb3RvY29sIGFkYXB0ZXJzIik7IAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsUHJvdG9jb2xBZGFwdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlNYXA8U3RyaW5nLCBQcm90b2NvbEFkYXB0ZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvdG9jb2xBZGFwdGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgYWRhcHRlcjogIiArIGlkKTsKLQkJCW1hcC5wdXQoaWQsIG5ldyBQcm90b2NvbEFkYXB0ZXIoY2ZbaV0pKTsKLQkJfQotCQlwcm90b2NvbEFkYXB0ZXJzID0gbWFwOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkQ29udGVudEZpbHRlcnMoKSB7Ci0JCWlmIChjb250ZW50RmlsdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIGNvbnRlbnQgZmlsdGVycyIpOyAKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbENvbnRlbnRGaWx0ZXJzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCU1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgZmlsdGVyOiAiICsgaWQpOwotCQkJbWFwLnB1dChpZCwgbmV3IENvbnRlbnRGaWx0ZXIoY2ZbaV0pKTsKLQkJfQotCQljb250ZW50RmlsdGVycyA9IG1hcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZXhlY3V0ZVN0YXJ0dXBzKCkgewotCQlpZiAoc3RhcnR1cHNMb2FkZWQpCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHN0YXJ0dXBzIik7IAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsU3RhcnR1cCIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTdHJpbmcgaWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHN0YXJ0dXA6ICIgKyBpZCk7Ci0JCQl0cnkgewotCQkJCUlTdGFydHVwIHN0YXJ0dXAgPSAoSVN0YXJ0dXApIGNmW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RhcnR1cC5zdGFydHVwKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlN0YXJ0dXAgZmFpbGVkIiArIHN0YXJ0dXAudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzdGFydHVwOiAiICsgaWQsIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvcldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1MjdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvcldvcmtpbmdDb3B5IGV4dGVuZHMgTW9uaXRvciBpbXBsZW1lbnRzIElNb25pdG9yV29ya2luZ0NvcHkgewotCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3Igd29ya2luZyBjb3B5LiAodXNlZCBmb3IgaW5pdGlhbCBjcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgTW9uaXRvcldvcmtpbmdDb3B5KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3Igd29ya2luZyBjb3B5LiAodXNlZCBmb3Igd29ya2luZyBjb3BpZXMpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhpcyB3b3JraW5nIGNvcHkgaXMgZm9yCi0JICovCi0JcHVibGljIE1vbml0b3JXb3JraW5nQ29weShNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJc2V0SW50ZXJuYWwobW9uaXRvcik7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjZ2V0T3JpZ2luYWwoKQotCSAqLwotCXB1YmxpYyBJTW9uaXRvciBnZXRPcmlnaW5hbCgpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQgdGhlIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0UmVtb3RlSG9zdChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCkgewotCQlyZW1vdGVIb3N0ID0gaG9zdDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRSZW1vdGVQb3J0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVQb3J0KGludCBwb3J0KSB7Ci0JCXJlbW90ZVBvcnQgPSBwb3J0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldExvY2FsUG9ydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxQb3J0KGludCBwb3J0KSB7Ci0JCWxvY2FsUG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0UHJvdG9jb2woU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbElkMikgewotCQlwcm90b2NvbElkID0gcHJvdG9jb2xJZDI7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0VGltZW91dChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dDIpIHsKLQkJdGltZW91dCA9IHRpbWVvdXQyOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldEF1dG9TdGFydChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIHN0YXJ0QnlEZWZhdWx0KSB7Ci0JCWF1dG9TdGFydCA9IHN0YXJ0QnlEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjaXNXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjY3JlYXRlV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJTW9uaXRvciBzYXZlKCkgewotCQlNb25pdG9yTWFuYWdlciBtbSA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCS8vYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkgewotCQkJCS8vcmVzdGFydCA9IHRydWU7Ci0JCQkJbW0uc3RvcE1vbml0b3IobW9uaXRvcik7Ci0JCQl9Ci0JCQltb25pdG9yLnNldEludGVybmFsKHRoaXMpOwotCQkJbW0ubW9uaXRvckNoYW5nZWQobW9uaXRvcik7Ci0JCQkvL2lmIChyZXN0YXJ0KQotCQkJLy8JbW0uc3RhcnRNb25pdG9yKG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7Ci0JCQltb25pdG9yLnNldEludGVybmFsKHRoaXMpOwotCQkJbW0uYWRkTW9uaXRvcihtb25pdG9yKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmOGMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm90b2NvbEFkYXB0ZXIgaW1wbGVtZW50cyBJUHJvdG9jb2xBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXByb3RlY3RlZCBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQl0cnkgewotCQkJZGVsZWdhdGUgPSAoUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOwotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0IHdpdGggdGhlIHByb3RvY29sLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEBwYXJhbSBpbiBhbiBpbmJvdW5kIHNvY2tldAotCSAqIEBwYXJhbSBvdXQgYW4gb3V0Ym91bmQgc29ja2V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXREZWxlZ2F0ZSgpLmNvbm5lY3QobW9uaXRvciwgaW4sIG91dCk7Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCBmcm9tIHRoZSBzb2NrZXRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlbGVnYXRlKCkuZGlzY29ubmVjdChtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwN2NkM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZXMsIHdoaWNoIHByb3ZpZGUgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBiZWhpbmQgYSBwYXJ0aWN1bGFyIHByb3RvY29sIGFkYXB0ZXIuCi0gKiBBIHByb3RvY29sIGFkYXB0ZXIgd2F0Y2hlcyB0aGUgbWVzc2FnZSB0cmFmZmljIHBhc3NpbmcgYmV0d2VlbiBjbGllbnQgYW5kCi0gKiBzZXJ2ZXI7IGl0IHBhcnNlcyB0aGUgbWVzc2FnZXMgYW5kIHJlcG9ydHMgdGhlbSBpbiB0aGUgZm9ybSBvZiAKLSAqIFJlcXVlc3Qgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wcm90b2NvbEFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgYmUgdXNlZAotICogYXV0b21hdGljYWxseSB0byBpbnN0YW50aWF0ZSB0aGUgZGVsZWdhdGUgd2hlbiByZXF1aXJlZC4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGlzIG9ubHkgb25lIGRlbGVnYXRlIGNyZWF0ZWQgcGVyIHByb3RvY29sLCBhbmQgdGhpcyBkZWxlZ2F0ZSBtdXN0Ci0gKiBiZSBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBtb25pdG9yIGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBkZWxlZ2F0ZQotICogdHlwaWNhbGx5IHdpbGwgbm90IGhhdmUgaW5zdGFuY2Ugc3RhdGUsIG9yIG11c3Qgc3luY2hyb25pemUgYW5kIGtlZXAgdGhlCi0gKiBzdGF0ZSBzZXBhcmF0ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBUaGUgSFRUUCBhbmQgVENQL0lQIGRlbGVnYXRlIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgdGhyZWFkcyB3aGljaAotICogc2h1ZmZsZSBpbmZvIGJldHdlZW4gc29ja2V0cy4gSWYgdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBob3cgZG8KLSAqIHRoZXNlIHRocmVhZHMgZ28gYXdheT8gTWV0aGlua3MgdGhhdCBkZWxlZ2F0ZXMgaW4gZ2VuZXJhbCBzaG91bGQgYmUgZm9yY2VkCi0gKiB0byBpbXBsZW1lbnQgZGlzY29ubmVjdChJTW9uaXRvcikgYXMgd2VsbC4gVGhpcyBtZXRob2Qgd291bGQgYmUgY2FsbGVkIGJ5IHRoZQotICogc3lzdGVtIHdoZW4gdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBvciB3aGVuIHRoZSBwbHVnLWluIGlzCi0gKiBiZWluZyBzaHV0IGRvd24uXQotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUgewotCS8qKgotCSAqIEVzdGFibGlzaGVzIGFuIG9uZ29pbmcgY29ubmVjdGlvbiBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIGJlaW5nCi0JICogbW9uaXRvcmVkIGJ5IHRoZSBnaXZlbiBtb25pdG9yLiBUaGUgPGNvZGU+aW48L2NvZGU+IHNvY2tldCBpcyBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgbW9uaXRvcidzIGNsaWVudC4gVGhlIDxjb2RlPm91dDwvY29kZT4gc29ja2V0IGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSBtb25pdG9yJ3Mgc2VydmVyLiBEaWZmZXJlbnQgYWRhcGF0ZXJzIGhhbmRsZSBkaWZmZXJlbnQgbmV0d29yawotCSAqIHByb3RvY29scy4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKLQkgKiA8dWw+Ci0JICogPGxpPkNsaWVudCB0byBzZXJ2ZXIgY29tbXVuaWNhdGlvbiAtCi0JICogT3BlbmluZyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIDxjb2RlPmluPC9jb2RlPiBzb2NrZXQsIG9wZW5pbmcgYW4gb3V0cHV0Ci0JICogc3RyZWFtIG9uIHRoZSA8Y29kZT5vdXQ8L2NvZGU+IHNvY2tldCwgYW5kIGVzdGFibGlzaGluZyBhIG1lY2hhbmlzbSB0aGF0Ci0JICogd2lsbCBwYXNzIGFsb25nIGFsbCBieXRlcyByZWNlaXZlZCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQKLQkgKiBzdHJlYW0uPC9saT4KLQkgKiA8bGk+U2VydmVyIHRvIGNsaWVudCBjb21tdW5pY2F0aW9uIC0gT3BlbmluZyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlCi0JICogPGNvZGU+b3V0PC9jb2RlPiBzb2NrZXQsIG9wZW5pbmcgYW4gb3V0cHV0IHN0cmVhbSBvbiB0aGUgPGNvZGU+aW48L2NvZGU+Ci0JICogc29ja2V0LCBhbmQgZXN0YWJsaXNoaW5nIGEgbWVjaGFuaXNtIHRoYXQgd2lsbCBwYXNzIGFsb25nIGFsbCBieXRlcwotCSAqIHJlY2VpdmVkIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uPC9saT4KLQkgKiA8bGk+UGFyc2luZyB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgbWVzc2FnZSB0cmFmZmljIHRvIGNyZWF0ZSBhbmQgcmVwb3J0Ci0JICogcmVxdWVzdCBvYmplY3RzIGZvciBlYWNoIG1lc3NhZ2UgcGFzc2VkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuPC9saT4KLQkgKiA8bGk+Q2xvc2luZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBzb2NrZXRzIGFuZCBvdGhlcndpc2UgY2xlYW5pbmcgdXAKLQkgKiBhZnRlcndhcmRzLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCB1c2VzIHRoaXMgcHJvdG9jb2wgYWRhcHRlcgotCSAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc29ja2V0IG9mIHRoZSBtb25pdG9yIGNsaWVudAotCSAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzb2NrZXQgb2YgdGhlIG1vbml0b3Igc2VydmVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXIgd2hlbiBvcGVuaW5nIHRoZSBzdHJlYW1zIG9mIHRoZQotCSAqICAgIGlucHV0IG9yIG91dHB1dCBzb2NrZXRzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY29ubmVjdChJTW9uaXRvciBtb25pdG9yLCBTb2NrZXQgaW4sIFNvY2tldCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDYWxsZWQgaWYgdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBvciB0aGUgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uCi0JICogVGhlIGRlbGVnYXRlIG11c3QgY2xlYW4gdXAgdGhlIGNvbm5lY3Rpb25zIGFuZCB0aHJlYWRzIGNyZWF0ZWQgdG8gcmVzcG9uZCB0bwotCSAqIHRoaXMgbW9uaXRvci4gCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Tb2NrZXRXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Tb2NrZXRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjRkZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvU29ja2V0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKLS8qKgotICogQSBzb2NrZXQgdGhhdCBpcyBvbmx5IHVzZWQgZm9yIHJlc2VuZGluZyByZXF1ZXN0cy4gQWxsIGlucHV0IG9wZXJhdGlvbnMgYXJlCi0gKiBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgU29ja2V0V3JhcHBlciBleHRlbmRzIFNvY2tldCB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNvY2tldCB3cmFwcGVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBTb2NrZXRXcmFwcGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JICB0aGlzLm91dHB1dFN0cmVhbSA9IG5ldyBEdW1teU91dHB1dFN0cmVhbSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGJpbmQoU29ja2V0QWRkcmVzcyBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNjbG9zZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjY29ubmVjdChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIGFyZzAsIGludCBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNjb25uZWN0KGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldENoYW5uZWwoKQotCSAqLwotCXB1YmxpYyBTb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGFubmVsKCk7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0SW5ldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBJbmV0QWRkcmVzcyBnZXRJbmV0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEluZXRBZGRyZXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRJbnB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0S2VlcEFsaXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRLZWVwQWxpdmUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0TG9jYWxBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYWxBZGRyZXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYWxQb3J0KCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldExvY2FsU29ja2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldExvY2FsU29ja2V0QWRkcmVzcygpOwotCX0KLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldE9PQklubGluZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T09CSW5saW5lKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRPT0JJbmxpbmUoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UG9ydCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJlY2VpdmVCdWZmZXJTaXplKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZWNlaXZlQnVmZmVyU2l6ZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpCi0JICovCi0JcHVibGljIFNvY2tldEFkZHJlc3MgZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFJldXNlQWRkcmVzcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXVzZUFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFNlbmRCdWZmZXJTaXplKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U2VuZEJ1ZmZlclNpemUoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFNvTGluZ2VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNvTGluZ2VyKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRTb0xpbmdlcigpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0U29UaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTb1RpbWVvdXQoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNvVGltZW91dCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0VGNwTm9EZWxheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VGNwTm9EZWxheSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0VGNwTm9EZWxheSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0VHJhZmZpY0NsYXNzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRyYWZmaWNDbGFzcygpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0VHJhZmZpY0NsYXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkgewotCQlyZXR1cm4gc3VwZXIuaXNCb3VuZCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNDbG9zZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0Nvbm5lY3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNJbnB1dFNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0U2h1dGRvd24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzT3V0cHV0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3V0cHV0U2h1dGRvd24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NlbmRVcmdlbnREYXRhKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kVXJnZW50RGF0YShpbnQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2VuZFVyZ2VudERhdGEoYXJnMCk7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0S2VlcEFsaXZlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldEtlZXBBbGl2ZShhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldE9PQklubGluZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9PQklubGluZShib29sZWFuIGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRPT0JJbmxpbmUoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlY2VpdmVCdWZmZXJTaXplKGludCBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbiBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0UmV1c2VBZGRyZXNzKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0U2VuZEJ1ZmZlclNpemUoaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZW5kQnVmZmVyU2l6ZShpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFNlbmRCdWZmZXJTaXplKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0U29MaW5nZXIoYm9vbGVhbiwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvTGluZ2VyKGJvb2xlYW4gYXJnMCwgaW50IGFyZzEpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRTb0xpbmdlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFNvVGltZW91dChpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNvVGltZW91dChpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFNvVGltZW91dChhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFRjcE5vRGVsYXkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUY3BOb0RlbGF5KGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFRjcE5vRGVsYXkoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRUcmFmZmljQ2xhc3MoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWZmaWNDbGFzcyhpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFRyYWZmaWNDbGFzcyhhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NodXRkb3duSW5wdXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2h1dGRvd25PdXRwdXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEEgZHVtbXkgT3V0cHV0U3RyZWFtIHRoYXQgYWxsb3dzIHVzIHRvIGZha2Ugb3V0cHV0IGZvciBhIHNvY2tldC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgRHVtbXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI2Nsb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQkKLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSNmbHVzaCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFByb3RvY29sQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBQcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNGVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFByb3RvY29sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ1BJUFByb3RvY29sQWRhcHRlciBleHRlbmRzIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgTWFwPElNb25pdG9yLCBDb25uZWN0aW9uPiBtYXAgPSBuZXcgSGFzaE1hcDxJTW9uaXRvciwgQ29ubmVjdGlvbj4oKTsKLQkKLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJQ29ubmVjdGlvbiBjb25uID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubik7Ci0JCVRDUElQVGhyZWFkIHJlcXVlc3RUaHJlYWQgPSBuZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJcmVxdWVzdFRocmVhZC5zdGFydCgpOwotCQluZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgb3V0LmdldElucHV0U3RyZWFtKCksIGluLmdldE91dHB1dFN0cmVhbSgpLCBmYWxzZSkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Rpc2Nvbm5lY3QoSU1vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJQ29ubmVjdGlvbiBjb25uID0gbWFwLmdldChtb25pdG9yKTsKLQkJCWNvbm4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGRlODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0vKioKLSAqIE1vbml0b3Igc2VydmVyIEkvTyB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ1BJUFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDIwNDg7Ci0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0OwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVxdWVzdDsKLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjb25uOwotCXByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVENQL0lQIHRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIG91dAotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKi8KLQlwdWJsaWMgVENQSVBUaHJlYWQoQ29ubmVjdGlvbiBjb25uLCBSZXF1ZXN0IHJlcXVlc3QsIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGlzUmVxdWVzdCkgewotCQlzdXBlcigiVENQL0lQIE1vbml0b3IgVENQL0lQIENvbm5lY3Rpb24iKTsKLQkJdGhpcy5jb25uID0gY29ubjsKLQkJdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdGhpcy5pbiA9IGluOwotCQl0aGlzLm91dCA9IG91dDsKLQkJdGhpcy5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7Ci0JCXNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZICsgMSk7Ci0JCXNldERhZW1vbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGlucHV0LCBzYXZlIGl0LCBhbmQgcGFzcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYiA9IG5ldyBieXRlW0JVRkZFUl07Ci0JCQlpbnQgbiA9IGluLnJlYWQoYik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYiwgMCwgbik7Ci0JCQkJaWYgKGIgIT0gbnVsbCAmJiBuID4gMCkgewotCQkJCQlieXRlW10geCA9IG51bGw7Ci0JCQkJCWlmIChuID09IEJVRkZFUikKLQkJCQkJCXggPSBiOwotCQkJCQllbHNlIHsKLQkJCQkJCXggPSBuZXcgYnl0ZVtuXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgeCwgMCwgbik7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzUmVxdWVzdCkKLQkJCQkJCXJlcXVlc3QuYWRkVG9SZXF1ZXN0KHgpOwotCQkJCQllbHNlCi0JCQkJCQlyZXF1ZXN0LmFkZFRvUmVzcG9uc2UoeCk7Ci0JCQkJfQotCQkJCW4gPSBpbi5yZWFkKGIpOwotCQkJCVRocmVhZC55aWVsZCgpOwotCQkJfQotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJLy9yZXF1ZXN0LmZpcmVDaGFuZ2VkRXZlbnQoKTsKLQkJCWlmICghaXNSZXF1ZXN0KQotCQkJCWNvbm4uY2xvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmMzkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JCi0JLyoqCi0JICogV2FybmluZyB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDE7Ci0JCi0JLyoqCi0JICogU2V2ZXJlIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCQotCS8qKgotCSAqIEZpbmVzdCB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQkKLQkvKioKLQkgKiBQYXJzaW5nIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTSU5HID0gNDsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKGxldmVsID09IFNFVkVSRSkKLQkJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmYyMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2NyZWF0ZUNoaWxkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChJbnB1dFN0cmVhbSBpbikgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Q2hpbGRyZW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2dldEludGVnZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAqCi0JICogQHBhcmFtIGluIHRoZSBpbnB1dCBzdHJlYW0KLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmV0dXJuIGNyZWF0ZVJlYWRSb290KGluKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dEludGVnZXIoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dFN0cmluZyhTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RyaW5nCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2F2ZVRvU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCJVVEYtOCIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCi0JCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNwdXRCb29sZWFuKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2I4NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8qKgotICogTWFuYWdlcyBhIG1vbml0b3Igc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gaG9zdHMuIFRoaXMKLSAqIGNvbm5lY3Rpb24gbWF5IHNwYXduIG9uZSBvciBtb3JlIFRDUC9JUCByZXF1ZXN0cyB0byBiZSBkaXNwbGF5ZWQKLSAqIGluIHRoZSBtb25pdG9yIHNlcnZlciB2aWV3LgotICovCi1wdWJsaWMgY2xhc3MgSFRUUENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBJTW9uaXRvciBtb25pdG9yOwotCi0JcHJvdGVjdGVkIGludCByZXEgPSAtMTsKLQlwcm90ZWN0ZWQgaW50IHJlc3AgPSAtMTsKLQotCXByb3RlY3RlZCBMaXN0PFJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOwotCi0JLyoqCi0JICogSFRUUENvbm5lY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSFRUUENvbm5lY3Rpb24oSU1vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiVENQL0lQIG1vbml0b3IgY29ubmVjdGlvbiBvcGVuZWQgIiArIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIGIgdGhlIHJlcXVlc3QgZGF0YQotCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoYnl0ZVtdIGIsIGJvb2xlYW4gaXNOZXcpIHsKLQkJaWYgKGlzTmV3KQotCQkJcmVxICsrOwotCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKLQkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcmVzcG9uc2UuCi0JICogCi0JICogQHBhcmFtIGIgdGhlIHJlc3BvbnNlIGRhdGEKLQkgKiBAcGFyYW0gaXNOZXcgdHJ1ZSBpZiBuZXcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNwb25zZShieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewotCQlpZiAoaXNOZXcpCi0JCQlyZXNwICsrOwotCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVzcCk7Ci0JCXJlcXVlc3QuYWRkVG9SZXNwb25zZShiKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwotCQlyZXF1ZXN0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gaXNSZXF1ZXN0Ci0JICogQHJldHVybiB0aGUgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShib29sZWFuIGlzUmVxdWVzdCkgewotCQlpZiAoaXNSZXF1ZXN0KQotCQkJcmV0dXJuIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwotCQkKLQkJcmV0dXJuIGdldFJlcXVlc3RSZXNwb25zZShyZXNwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRSZXF1ZXN0UmVzcG9uc2UoaW50IGkpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl3aGlsZSAoaSA+PSByZXF1ZXN0cy5zaXplKCkpIHsKLQkJCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgSFRUUFJlcXVlc3QoKE1vbml0b3IpIG1vbml0b3IsIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCksIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSk7Ci0JCQkJcmVxdWVzdHMuYWRkKHJlcXVlc3QpOwotCQkJCXJldHVybiByZXF1ZXN0OwotCQkJfQotCQkJcmV0dXJuIHJlcXVlc3RzLmdldChpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZQotCSAqIEBwYXJhbSBpc05ldyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIHRpdGxlLCBib29sZWFuIGlzTmV3KSB7Ci0JCWlmIChpc05ldykKLQkJCXJlcSArKzsKLQkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7Ci0JCXJlcXVlc3Quc2V0TmFtZSh0aXRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyNGNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhUVFBQcm90b2NvbEFkYXB0ZXIgZXh0ZW5kcyBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIE1hcDxJTW9uaXRvciwgQ29ubmVjdGlvbj4gbWFwID0gbmV3IEhhc2hNYXA8SU1vbml0b3IsIENvbm5lY3Rpb24+KCk7Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubjIpOwotCQlIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IEhUVFBDb25uZWN0aW9uKG1vbml0b3IpOwotCQlIVFRQVGhyZWFkIHJlcXVlc3QgPSBuZXcgSFRUUFRocmVhZChjb25uMiwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCBjb25uLCB0cnVlLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQlIVFRQVGhyZWFkIHJlc3BvbnNlID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIG91dC5nZXRJbnB1dFN0cmVhbSgpLCBpbi5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgZmFsc2UsICJsb2NhbGhvc3QiLCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCByZXF1ZXN0KTsKLQkJcmVxdWVzdC5zdGFydCgpOwotCQlyZXNwb25zZS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUjZGlzY29ubmVjdChJTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDb25uZWN0aW9uIGNvbm4gPSBtYXAuZ2V0KG1vbml0b3IpOwotCQkJaWYgKGNvbm4gIT0gbnVsbCkKLQkJCQljb25uLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3QgZXh0ZW5kcyBSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfSEVBREVSID0gInJlcXVlc3QtaGVhZGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0hFQURFUiA9ICJyZXNwb25zZS1oZWFkZXIiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0JPRFkgPSAicmVxdWVzdC1ib2R5IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0JPRFkgPSAicmVzcG9uc2UtYm9keSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWSA9IG5ldyBieXRlWzBdOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEhUVFBSZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGxvY2FsUG9ydAotCSAqIEBwYXJhbSByZW1vdGVIb3N0Ci0JICogQHBhcmFtIHJlbW90ZVBvcnQKLQkgKi8KLQlwdWJsaWMgSFRUUFJlcXVlc3QoTW9uaXRvciBtb25pdG9yLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKLQkJc3VwZXIobW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5IVFRQX1BST1RPQ09MX0lELCBsb2NhbFBvcnQsIHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVxdWVzdCNnZXRSZXF1ZXN0KGludCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUyKSB7Ci0JCWlmICh0eXBlMiA9PSBBTEwpCi0JCQlyZXR1cm4gcmVxdWVzdDsKLQkJZWxzZSBpZiAodHlwZTIgPT0gVFJBTlNQT1JUKQotCQkJcmV0dXJuIGdldFJlcXVlc3RIZWFkZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFJlcXVlc3RDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXF1ZXN0I2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlc3BvbnNlKGludCB0eXBlMikgewotCQlpZiAodHlwZTIgPT0gQUxMKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQllbHNlIGlmICh0eXBlMiA9PSBUUkFOU1BPUlQpCi0JCQlyZXR1cm4gZ2V0UmVzcG9uc2VIZWFkZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFJlc3BvbnNlQ29udGVudCgpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIpOwotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoYnl0ZVtdKSBvYmo7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZKTsKLQkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVzcG9uc2VIZWFkZXIoKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRQcm9wZXJ0eShIVFRQX1JFU1BPTlNFX0hFQURFUik7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlc3BvbnNlQ29udGVudCgpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfQk9EWSk7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7Ci0JCXN1cGVyLnNldE5hbWUobik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNmI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb25pdG9yIHNlcnZlciBJL08gdGhyZWFkLgotICovCi1wdWJsaWMgY2xhc3MgSFRUUFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDIwNDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBDUiA9IChieXRlKSAnXHInOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAoYnl0ZSkgJ1xuJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCB0aHJlYWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIGJ5dGVbXSByZWFkQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCS8vIGJ1ZmZlciBhbmQgaW5kZXgKLQlwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBpbnQgYnVmZmVySW5kZXggPSAwOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0OwotCXByb3RlY3RlZCBIVFRQQ29ubmVjdGlvbiBjb25uOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVxdWVzdDsKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjb25uMjsKLQkKLQlwcm90ZWN0ZWQgSFRUUFRocmVhZCByZXF1ZXN0OwotCXByb3RlY3RlZCBib29sZWFuIGlzV2FpdGluZzsKLQkKLQkvLyB1c2VyIHRvIHRyYW5zbGF0ZSB0aGUgSG9zdDogaGVhZGVyCi0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCXByb3RlY3RlZCBpbnQgcG9ydDsKLQotCXByb3RlY3RlZCBpbnQgY29udGVudExlbmd0aCA9IC0xOwotCXByb3RlY3RlZCBieXRlIHRyYW5zZmVyRW5jb2RpbmcgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3BvbnNlVHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25DbG9zZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTkNPRElOR19TVFJJTkcgPSBuZXcgU3RyaW5nW10gewotCQkiY2h1bmtlZCIsICJpZGVudGl0eSIsICJnemlwIiwgImNvbXByZXNzZWQiLCAiZGVmbGF0ZSJ9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0NIVU5LRUQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19JREVOVElUWSA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0daSVAgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19DT01QUkVTU0VEID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfREVGTEFURSA9IDQ7Ci0KLS8qIGNoYW5nZToKLVJlZmVyZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9pbmRleC5odG1sCi1Ib3N0OiBsb2NhbGhvc3Q6ODA4MQotKi8KLS8qIFRoZSBDb25uZWN0aW9uIGhlYWRlciBoYXMgdGhlIGZvbGxvd2luZyBncmFtbWFyOgotCi0JICAgQ29ubmVjdGlvbiA9ICJDb25uZWN0aW9uIiAiOiIgMSMoY29ubmVjdGlvbi10b2tlbikKLQkgICBjb25uZWN0aW9uLXRva2VuICA9IHRva2VuCi0KLSAgIEhUVFAvMS4xIHByb3hpZXMgTVVTVCBwYXJzZSB0aGUgQ29ubmVjdGlvbiBoZWFkZXIgZmllbGQgYmVmb3JlIGEKLSAgIG1lc3NhZ2UgaXMgZm9yd2FyZGVkIGFuZCwgZm9yIGVhY2ggY29ubmVjdGlvbi10b2tlbiBpbiB0aGlzIGZpZWxkLAotICAgcmVtb3ZlIGFueSBoZWFkZXIgZmllbGQocykgZnJvbSB0aGUgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0gICBjb25uZWN0aW9uLXRva2VuLiAqLwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEhUVFAgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBjb25uMgotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKiBAcGFyYW0gaG9zdAotCSAqIEBwYXJhbSBwb3J0Ci0JICovCi0JcHVibGljIEhUVFBUaHJlYWQoQ29ubmVjdGlvbiBjb25uMiwgSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIEhUVFBDb25uZWN0aW9uIGNvbm4sIGJvb2xlYW4gaXNSZXF1ZXN0LCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJc3VwZXIoIlRDUC9JUCBNb25pdG9yIEhUVFAgQ29ubmVjdGlvbiIpOwotCQl0aGlzLmNvbm4yID0gY29ubjI7Ci0JCXRoaXMuaW4gPSBpbjsKLQkJdGhpcy5vdXQgPSBvdXQ7Ci0JCXRoaXMuY29ubiA9IGNvbm47Ci0JCXRoaXMuaXNSZXF1ZXN0ID0gaXNSZXF1ZXN0OwotCQl0aGlzLmhvc3QgPSBob3N0OwotCQl0aGlzLnBvcnQgPSBwb3J0OwotCQotCQlzZXROYW1lKCJIVFRQICgiICsgaG9zdCArICI6IiArIHBvcnQgKyAiKSAiICsgKGlzUmVxdWVzdCA/ICJSRVFVRVNUIiA6ICJSRVNQT05TRSIpICsgIiAiICsgKHRocmVhZENvdW50KyspKTsKLQkJc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKLQkJc2V0RGFlbW9uKHRydWUpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlN0YXJ0ZWQ6ICIgKyB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEhUVFAgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBjb25uMgotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKiBAcGFyYW0gaG9zdAotCSAqIEBwYXJhbSBwb3J0Ci0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgSFRUUFRocmVhZChDb25uZWN0aW9uIGNvbm4yLCBJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgSFRUUENvbm5lY3Rpb24gY29ubiwgYm9vbGVhbiBpc1JlcXVlc3QsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgSFRUUFRocmVhZCByZXF1ZXN0KSB7Ci0JCXRoaXMoY29ubjIsIGluLCBvdXQsIGNvbm4sIGlzUmVxdWVzdCwgaG9zdCwgcG9ydCk7Ci0JCQotCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpbmUgZmVlZCB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGFycmF5LgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICogQHBhcmFtIGIgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gY29udmVydChieXRlW10gYikgewotCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gYjsKLQkKLQkJaW50IHNpemUgPSBiLmxlbmd0aDsKLQkJYnl0ZVtdIHggPSBuZXcgYnl0ZVtzaXplICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgeCwgMCwgc2l6ZSk7Ci0JCXhbc2l6ZV0gPSAoYnl0ZSkgJ1xyJzsgICAgIC8vIENSCi0JCXhbc2l6ZSArIDFdID0gKGJ5dGUpICdcbic7IC8vIExGCi0JCXJldHVybiB4OwotCX0KLQotCS8qKgotCSAqIFJlYWQgbW9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkKLQkJaWYgKG4gPD0gMCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW5kIG9mIGlucHV0Iik7Ci0JCQotCQkvLyBhZGQgdG8gZnVsbCBidWZmZXIKLQkJaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKLQkJaWYgKGxlbiA8IDApCi0JCQlsZW4gPSAwOwotCQlieXRlW10geCA9IG5ldyBieXRlW24gKyBsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIHgsIDAsIGxlbik7Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVhZEJ1ZmZlciwgMCwgeCwgbGVuLCBuKTsKLQkJYnVmZmVySW5kZXggPSAwOwotCQlidWZmZXIgPSB4OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGxvY2F0aW9uIG9mIGEgQ1JMRi4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJvdGVjdGVkIGludCBnZXRGaXJzdENSTEYoKSB7Ci0JCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGkgPSBidWZmZXJJbmRleCArIDE7Ci0JCXdoaWxlIChpIDwgc2l6ZSkgewotCQkJaWYgKGJ1ZmZlcltpIC0gMV0gPT0gQ1IgJiYgYnVmZmVyW2ldID09IExGKQotCQkJCXJldHVybiBpOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRwdXQgdGhlIGdpdmVuIGJ5dGVzLgotCSAqIEBwYXJhbSBiIGJ5dGVbXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dHB1dEJ5dGVzKGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQud3JpdGUoYik7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQljb25uLmFkZFJlcXVlc3QoYiwgaXNOZXcpOwotCQllbHNlCi0JCQljb25uLmFkZFJlc3BvbnNlKGIsIGlzTmV3KTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgSFRUUCBib2R5LgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBib2R5IGZvcjogIiArIHRoaXMpOwotCQkKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmICgiMjA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSB8fCAiMzA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSkpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGlzUmVxdWVzdCkgewotCQkJaWYgKGNvbnRlbnRMZW5ndGggIT0gLTEpIHsKLQkJCQlpZiAoY29udGVudExlbmd0aCA8IDEwMjQgKiAxMDI0KSB7IC8vIDFNYgotCQkJCQlieXRlW10gYiA9IHJlYWRCeXRlcyhjb250ZW50TGVuZ3RoKTsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCQljb25uLmFkZFJlcXVlc3QoYiwgZmFsc2UpOwotCQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlW10gYiA9IHJlbW92ZUZyb21CdWZmZXIoTWF0aC5taW4oYnVmZmVySW5kZXgsIGNvbnRlbnRMZW5ndGgpKTsKLQkJCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCQkKLQkJCQkJaW50IG4gPSAwOwotCQkJCQl3aGlsZSAoYnl0ZXNMZWZ0ID4gMCkgewotCQkJCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQkJCQlieXRlc0xlZnQgLT0gbjsKLQkJCQkJCW91dC53cml0ZShyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYiA9IE1lc3NhZ2VzLmVycm9yQ29udGVudFNpemUuZ2V0Qnl0ZXMoKTsKLQkJCQkJY29ubi5hZGRSZXF1ZXN0KGIsIGZhbHNlKTsKLQkJCQkJc2V0SFRUUEJvZHkoYik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgIT0gRU5DT0RJTkdfSURFTlRJVFkpIHsKLQkJCQlwYXJzZUNodW5rKCk7Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIHBhcnNpbmcgcmVxdWVzdCBib2R5IGZvcjogIiArIHRoaXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBqdXN0IHJldHVybiBib2R5IGZvciBIVFRQIDEuMCByZXNwb25zZXMKLQkJaWYgKCFpc1JlcXVlc3QgJiYgIWNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29udGVudExlbmd0aCA9PSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nID09IC0xKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQXNzdW1pbmcgSFRUUCAxLjAgZm9yOiAiICsgdGhpcyk7Ci0JCQlpbnQgbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKLQkJCWJ5dGVbXSBiID0gcmVhZEJ5dGVzKG4pOwotCQkJYnl0ZVtdIGJvZHkgPSBuZXcgYnl0ZVswXTsKLQkJCXdoaWxlIChuID49IDApIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQnl0ZXMgcmVhZDogIiArIG4gKyAiICIgKyB0aGlzKTsKLQkJCQlpZiAoYiAhPSBudWxsICYmIG4gPiAwKSB7Ci0JCQkJCWJ5dGVbXSB4ID0gbnVsbDsKLQkJCQkJaWYgKG4gPT0gYi5sZW5ndGgpCi0JCQkJCQl4ID0gYjsKLQkJCQkJZWxzZSB7Ci0JCQkJCQl4ID0gbmV3IGJ5dGVbbl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIHgsIDAsIG4pOwotCQkJCQl9Ci0JCQkJCW91dHB1dEJ5dGVzKHgsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCS8vIGNvcHkgdG8gSFRUUCBib2R5Ci0JCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYm9keS5sZW5ndGggKyB4Lmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYm9keSwgMCwgdGVtcCwgMCwgYm9keS5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHgsIDAsIHRlbXAsIGJvZHkubGVuZ3RoLCB4Lmxlbmd0aCk7Ci0JCQkJCWJvZHkgPSB0ZW1wOwotCQkJCX0KLQkJCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoIDwgQlVGRkVSKQotCQkJCQliID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQkJCQluID0gaW4ucmVhZChiKTsKLQkJCQlUaHJlYWQueWllbGQoKTsKLQkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQkJc2V0SFRUUEJvZHkoYm9keSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNwZWMgNC40LjEKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5zdGFydHNXaXRoKCIxIikpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc3BlYyA0LjQuMgotCQlpZiAodHJhbnNmZXJFbmNvZGluZyAhPSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nICE9IEVOQ09ESU5HX0lERU5USVRZKSB7Ci0JCQlwYXJzZUNodW5rKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNwZWMgNC40LjMKLQkJaWYgKGNvbnRlbnRMZW5ndGggIT0gLTEpIHsKLQkJCWlmIChjb250ZW50TGVuZ3RoIDwgMTAyNCAqIDEwMjQpIHsgLy8gMU1iCi0JCQkJYnl0ZVtdIGIgPSByZWFkQnl0ZXMoY29udGVudExlbmd0aCk7Ci0JCQkJb3V0LndyaXRlKGIpOwotCQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJCWNvbm4uYWRkUmVxdWVzdChiLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQljb25uLmFkZFJlc3BvbnNlKGIsIGZhbHNlKTsKLQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnl0ZVtdIGIgPSByZW1vdmVGcm9tQnVmZmVyKE1hdGgubWluKGJ1ZmZlckluZGV4LCBjb250ZW50TGVuZ3RoKSk7Ci0JCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKLQkJCQlvdXQud3JpdGUoYik7Ci0JCQkJCi0JCQkJaW50IG4gPSAwOwotCQkJCXdoaWxlIChieXRlc0xlZnQgPiAwKSB7Ci0JCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQlieXRlc0xlZnQgLT0gbjsKLQkJCQkJb3V0LndyaXRlKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQkKLQkJCQliID0gTWVzc2FnZXMuZXJyb3JDb250ZW50U2l6ZS5nZXRCeXRlcygpOwotCQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJCWNvbm4uYWRkUmVxdWVzdChiLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQljb25uLmFkZFJlc3BvbnNlKGIsIGZhbHNlKTsKLQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc3BlYyA0LjQuNCAoPykKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJVbmtub3duIGJvZHkgZm9yOiAiICsgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgYW4gSFRUUCBjaHVuay4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2VDaHVuaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGNodW5rIGZvcjogIiArIHRoaXMpOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJYnl0ZVtdIGJvZHkgPSBuZXcgYnl0ZVswXTsKLQkKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkvLyByZWFkIGNodW5rIHNpemUKLQkJCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkKLQkJCVN0cmluZyBzID0gbmV3IFN0cmluZyhiKTsKLQkJCWludCBpbmRleCA9IHMuaW5kZXhPZigiICIpOwotCQkJaW50IGxlbmd0aCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQocy50cmltKCksIDE2KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGNodW5rIGZvcjogIiArIHRoaXMsIGUpOwotCQkJfQotCQotCQkJLy8gb3V0cHV0IGJ5dGVzCi0JCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7Ci0JCi0JCQlpZiAobGVuZ3RoIDw9IDApCi0JCQkJZG9uZSA9IHRydWU7Ci0JCQllbHNlIHsKLQkJCQkvLyByZWFkIGFuZCBvdXRwdXQgY2h1bmsgZGF0YSBwbHVzIENSTEYKLQkJCQliID0gcmVhZEJ5dGVzKGxlbmd0aCArIDIpOwotCQkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBjb3B5IHRvIEhUVFAgYm9keQotCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYm9keS5sZW5ndGggKyBiLmxlbmd0aCAtIDJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYm9keSwgMCwgdGVtcCwgMCwgYm9keS5sZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgdGVtcCwgYm9keS5sZW5ndGgsIGIubGVuZ3RoIC0gMik7Ci0JCQkJYm9keSA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gcmVhZCB0cmFpbGVyCi0JCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkJd2hpbGUgKGIubGVuZ3RoID4gMikgewotCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCQkJYiA9IHJlYWRMaW5lKCk7Ci0JCX0KLQkKLQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCQlzZXRIVFRQQm9keShib2R5KTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBIVFRQIGhlYWRlci4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2VIZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBoZWFkZXIgZm9yOiAiICsgdGhpcyk7Ci0JCi0JCS8vIHJlYWQgdW50aWwgZmlyc3QgYmxhbmsgbGluZQotCQlib29sZWFuIGlzRmlyc3RMaW5lID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc05ldyA9IHRydWU7Ci0JCi0JCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkJd2hpbGUgKGIubGVuZ3RoID4gNSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlBhcnNpbmcgaGVhZGVyIGxpbmU6ICciICsgbmV3IFN0cmluZyhiKSArICInIik7Ci0JCQkKLQkJCWlmIChpc0ZpcnN0TGluZSkgewotCQkJCVN0cmluZyBzID0gbmV3IFN0cmluZyhiKTsKLQkJCQlpZiAoaXNSZXF1ZXN0KSB7Ci0JCQkJCXNldExhYmVsKHMpOwotCQkJCQlpc05ldyA9IGZhbHNlOwotCQkJCX0KLQkKLQkJCQlpZiAoIWlzUmVxdWVzdCkgewotCQkJCQlpbnQgaW5kZXgxID0gcy5pbmRleE9mKCcgJyk7Ci0JCQkJCWludCBpbmRleDIgPSBzLmluZGV4T2YoJyAnLCBpbmRleDEgKyAxKTsKLQkKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3BvbnNlVHlwZSA9IHMuc3Vic3RyaW5nKGluZGV4MSArIDEsIGluZGV4MikudHJpbSgpOwotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlJlc3BvbnNlIFR5cGU6ICIgKyB0aGlzICsgIiAiICsgcmVzcG9uc2VUeXBlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBwYXJzaW5nIHJlc3BvbnNlIHR5cGUgZm9yOiAiICsgdGhpcywgZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5lcXVhbHMoIjEwMCIpKSB7Ci0JCQkJCQlvdXRwdXRCeXRlcyhiLCBpc05ldyk7Ci0JCQkJCQlpc05ldyA9IGZhbHNlOwotCi0JCQkJCQliID0gcmVhZExpbmUoKTsKLQkJCQkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQotCQkJCQkJYiA9IHJlYWRMaW5lKCk7Ci0KLQkJCQkJCWluZGV4MSA9IHMuaW5kZXhPZignICcpOwotCQkJCQkJaW5kZXgyID0gcy5pbmRleE9mKCcgJywgaW5kZXgxICsgMSk7Ci0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVzcG9uc2VUeXBlID0gcy5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKS50cmltKCk7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlJlc3BvbnNlIFR5cGU6ICIgKyB0aGlzICsgIiAiICsgcmVzcG9uc2VUeXBlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIHBhcnNpbmcgcmVzcG9uc2UgdHlwZSBmb3I6ICIgKyB0aGlzLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpc0ZpcnN0TGluZSA9IGZhbHNlOwotCQkJfQotCQotCQkJLy8gdHJhbnNsYXRlCi0JCQliID0gdHJhbnNsYXRlSGVhZGVyTGluZShiKTsKLQkJCQotCQkJb3V0cHV0Qnl0ZXMoYiwgaXNOZXcpOwotCQkJaXNOZXcgPSBmYWxzZTsKLQkKLQkJCWIgPSByZWFkTGluZSgpOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBmaW5hbCBoZWFkZXIgbGluZTogJyIgKyBuZXcgU3RyaW5nKGIpICsgIiciKTsKLQkJCi0JCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQkJCi0JCVJlcXVlc3QgcnIgPSBjb25uLmdldFJlcXVlc3RSZXNwb25zZShpc1JlcXVlc3QpOwotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiU2V0dGluZyBoZWFkZXIgbGVuZ3RoOiAiICsgcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkFMTCkubGVuZ3RoKTsKLQkJCi0JCXNldEhUVFBIZWFkZXIocnIpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSByZWFkQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJyZWFkQnl0ZXMoKSAiICsgbiArICIgZm9yOiAiICsgdGhpcyk7Ci0JCXdoaWxlIChidWZmZXIubGVuZ3RoIC0gYnVmZmVySW5kZXggPCBuKQotCQkJZmlsbEJ1ZmZlcigpOwotCQkKLQkJcmV0dXJuIHJlbW92ZUZyb21CdWZmZXIoYnVmZmVySW5kZXggKyBuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGFuZCByZXR1cm4gdGhlIG5leHQgZnVsbCBsaW5lLgotCSAqCi0JICogQHJldHVybiBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgInJlYWRMaW5lKCkgZm9yOiAiICsgdGhpcyk7Ci0JCQotCQlpbnQgbiA9IGdldEZpcnN0Q1JMRigpOwotCQl3aGlsZSAobiA8IDApIHsKLQkJCWZpbGxCdWZmZXIoKTsKLQkJCW4gPSBnZXRGaXJzdENSTEYoKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlRnJvbUJ1ZmZlcihuICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHVwIHRvIHRoZSBhYnNvbHV0ZSBpbmRleCBuLgotCSAqIFJldHVybiB0aGUgZGF0YSBmcm9tIGJldHdlZW4gYnVmZmVySW5kZXggYW5kIG4uCi0JICoKLQkgKiBAcGFyYW0gbiB0aGUgYnl0ZXMgdG8gcmVtb3ZlCi0JICogQHJldHVybiBhIGJ5dGUgYXJyYXkKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlbW92ZUZyb21CdWZmZXIoaW50IG4pIHsKLQkJLy8gY29weSBsaW5lIG91dCBvZiBidWZmZXIKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtuIC0gYnVmZmVySW5kZXhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIGIsIDAsIG4gLSBidWZmZXJJbmRleCk7Ci0JCQotCQlpZiAoYnVmZmVyLmxlbmd0aCA+IEJVRkZFUiAqIDIgfHwgYnVmZmVySW5kZXggPiBCVUZGRVIpIHsKLQkJCS8vIHJlbW92ZSBsaW5lIGZyb20gYnVmZmVyCi0JCQlpbnQgc2l6ZSA9IGJ1ZmZlci5sZW5ndGg7Ci0JCQlieXRlW10geCA9IG5ldyBieXRlW3NpemUgLSBuXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBuLCB4LCAwLCBzaXplIC0gbik7Ci0JCQlidWZmZXIgPSB4OwotCQkJYnVmZmVySW5kZXggPSAwOwotCQl9IGVsc2UKLQkJCWJ1ZmZlckluZGV4ID0gbjsKLQkJCi0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIExpc3RlbiBmb3IgaW5wdXQsIHNhdmUgaXQsIGFuZCBwYXNzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIFBoaWxvc29waHk6IFJlYWQgYSBzaW5nbGUgbGluZSBzZXBhcmF0ZWx5IGFuZCB0cmFuc2xhdGUuCi0JICogV2hlbiBibGFuayBsaW5lIGlzIHJlYWNoZWQsIGp1c3QgcGFzcyBhbGwgb3RoZXIgZGF0YSB0aHJvdWdoLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJY29udGVudExlbmd0aCA9IC0xOwotCQkJCQl0cmFuc2ZlckVuY29kaW5nID0gLTE7Ci0JCQkJCWNvbm5lY3Rpb25LZWVwQWxpdmUgPSBmYWxzZTsKLQkJCQkJY29ubmVjdGlvbkNsb3NlID0gZmFsc2U7Ci0JCQkJCQotCQkJCQlwYXJzZUhlYWRlcigpOwotCQkJCQlwYXJzZUJvZHkoKTsKLQkJCQkJCi0JCQkJCWlmIChpc1JlcXVlc3QgJiYgY29ubmVjdGlvbktlZXBBbGl2ZSkKLQkJCQkJCXdhaXRGb3JSZXNwb25zZSgpOwotCQkJCQkKLQkJCQkJLy9SZXF1ZXN0IHIgPSBjb25uLmdldFJlcXVlc3RSZXNwb25zZSh0cnVlKTsKLQkJCQkJLy9yLmZpcmVDaGFuZ2VkRXZlbnQoKTsKLQkJCQkJCi0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIEhUVFAgcmVxdWVzdCBmb3IgIiArIHRoaXMgKyAiICIgKyBjb25uZWN0aW9uS2VlcEFsaXZlKTsKLQkJCQkJaWYgKCFpc1JlcXVlc3QgJiYgKCFyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgfHwgY29ubmVjdGlvbkNsb3NlKSkgewotCQkJCQkJY29ubjIuY2xvc2UoKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29ubmVjdGlvbkNsb3NlKQotCQkJCQkJCXJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOwotCQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIWlzUmVxdWVzdCkKLQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCi0JCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyByZWFjaGVkIGVuZCBvZiBpbnB1dAotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFbmQgb2YgYnVmZmVyIGZvcjogIiArIHRoaXMsIGUpOwotCQkJCWlmICghaXNSZXF1ZXN0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgPSBmYWxzZTsKLQkJCQkJCXJlcXVlc3QuY29ubjIuY2xvc2UoKTsKLQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2xvc2luZyByZXF1ZXN0IGluIHJlc3BvbnNlIHRvIGVycm9yOiAiICsgdGhpcywgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNlbmQgcmVzdCBvZiBidWZmZXIKLQkJCW91dC53cml0ZShidWZmZXIsIGJ1ZmZlckluZGV4LCBidWZmZXIubGVuZ3RoIC0gYnVmZmVySW5kZXgpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW46ICIgKyB0aGlzLCBlKTsKLQkJfQotCQkvL2lmICghaXNSZXF1ZXN0KQotCQkvLwljb25uMi5jbG9zZSgpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNsb3NpbmcgdGhyZWFkICIgKyB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGUgY2FsbC4KLQkgKgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbChTdHJpbmcgcykgewotCQl0cnkgewotCQkJaW50IGluZGV4MSA9IHMuaW5kZXhPZignICcpOwotCQkJaWYgKGluZGV4MSA8IDAgfHwgaW5kZXgxID4gMTUpCi0JCQkJcmV0dXJuOwotCQkJaW50IGluZGV4MiA9IHMuaW5kZXhPZignICcsIGluZGV4MSArIDEpOwotCQkJaWYgKGluZGV4MiA8IDApCi0JCQkJcmV0dXJuOwotCQotCQkJY29ubi5zZXRMYWJlbChzLnN1YnN0cmluZyhpbmRleDEgKyAxLCBpbmRleDIpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIHRoZSBoZWFkZXIgbGluZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGVbXQotCSAqIEBwYXJhbSBiIGJ5dGVbXQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gdHJhbnNsYXRlSGVhZGVyTGluZShieXRlW10gYikgewotCQlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoYik7Ci0JCi0JCWlmIChpc1JlcXVlc3QgJiYgcy5zdGFydHNXaXRoKCJIb3N0OiAiKSkgewotCQkJU3RyaW5nIHQgPSAiSG9zdDogIiArIGhvc3Q7Ci0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl0ICs9ICI6IiArIHBvcnQ7Ci0JCQlyZXR1cm4gY29udmVydCh0LmdldEJ5dGVzKCkpOwotCQl9IGVsc2UgaWYgKHMuc3RhcnRzV2l0aCgiQ29udGVudC1MZW5ndGg6ICIpKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKDE2KS50cmltKCkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJDb250ZW50IGxlbmd0aDogIiArIHRoaXMgKyAiICIgKyBjb250ZW50TGVuZ3RoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNvbnRlbnQgbGVuZ3RoIGVycm9yIiwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocy5zdGFydHNXaXRoKCJDb25uZWN0aW9uOiAiKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdCA9IHMuc3Vic3RyaW5nKDExKS50cmltKCk7Ci0JCQkJaWYgKHQuZXF1YWxzSWdub3JlQ2FzZSgiS2VlcC1BbGl2ZSIpKQotCQkJCQljb25uZWN0aW9uS2VlcEFsaXZlID0gdHJ1ZTsKLQkJCQkvLyByZXNwb25zZSBjb250YWlucyAiQ29ubmVjdGlvbjogY2xvc2UiIGhlYWRlcgotCQkJCS8vIGNsb3NlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBldmVuIGlmICJrZWVwYWxpdmUiIGhhZCBiZWVuIHJlcXVlc3RlZAotCQkJCS8vIHdlIGNhbid0IGp1c3QgcmVzZXQgcmVxdWVzdC5rZWVwQWxpdmUgLSBpdCdzIHVzZWQgYXMgaW5kaWNhdG9yIHdoZXRoZXIKLQkJCQkvLyB0aGUgcmVxdWVzdCB0aHJlYWQgaXMgKGdvaW5nIHRvKSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgdGhyZWFkCi0JCQkJLy8gKGFuZCBtdXN0IGJlIG5vdGlmaWVkIChvbmx5IHRoZW4pKSwKLQkJCQkvLyBzbyB3ZSBoYXZlIHRvIGxldCBpdCBhbG9uZQotCQkJCWlmICh0LmVxdWFsc0lnbm9yZUNhc2UoImNsb3NlIikpCi0JCQkJCWNvbm5lY3Rpb25DbG9zZSA9IHRydWU7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIktlZXAgYWxpdmU6ICIgKyBjb25uZWN0aW9uS2VlcEFsaXZlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGdldHRpbmcgQ29ubmVjdGlvbjogZnJvbSBoZWFkZXIiLCBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoIlRyYW5zZmVyLUVuY29kaW5nOiAiKSkgewotCQkJU3RyaW5nIHQgPSBzLnN1YnN0cmluZygxOSkudHJpbSgpOwotCQkJaW50IHNpemUgPSBFTkNPRElOR19TVFJJTkcubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoRU5DT0RJTkdfU1RSSU5HW2ldLmVxdWFsc0lnbm9yZUNhc2UodCkpIHsKLQkJCQkJdHJhbnNmZXJFbmNvZGluZyA9IChieXRlKSBpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiVHJhbnNmZXIgZW5jb2Rpbmc6ICIgKyBFTkNPRElOR19TVFJJTkdbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQ2xvc2luZzogIiArIHRoaXMpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uICIgKyB0aGlzLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZXNwb25zZSgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIldhaXRpbmcgZm9yIHJlc3BvbnNlICIgKyB0aGlzKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCWlzV2FpdGluZyA9IHRydWU7Ci0JCQkJd2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW4gd2FpdEZvclJlc3BvbnNlKCkgIiArIHRoaXMsIGUpOwotCQkJfQotCQkJaXNXYWl0aW5nID0gZmFsc2U7Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkRvbmUgd2FpdGluZyBmb3IgcmVzcG9uc2UgIiArIHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVJlcXVlc3QoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJOb3RpZnlpbmcgcmVxdWVzdCAiICsgdGhpcyk7Ci0JCXdoaWxlIChyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgIXJlcXVlc3QuaXNXYWl0aW5nKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiV2FpdGluZyBmb3IgcmVxdWVzdCAiICsgdGhpcyk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHJlcXVlc3QpIHsKLQkJCXRyeSB7Ci0JCQkJcmVxdWVzdC5ub3RpZnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGluIG5vdGlmeVJlcXVlc3QoKSAiICsgdGhpcywgZSk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkRvbmUgbm90aWZ5aW5nIHJlcXVlc3QgIiArIHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEhUVFBIZWFkZXIoUmVxdWVzdCBycikgewotCQlpZiAoaXNSZXF1ZXN0KSB7Ci0JCQlieXRlW10gYiA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5BTEwpOwotCQkJYnl0ZVtdIGggPSBuZXcgYnl0ZVtiLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIGgsIDAsIGIubGVuZ3RoKTsKLQkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVRVUVTVF9IRUFERVIsIGgpOwotCQl9IGVsc2UgewotCQkJYnl0ZVtdIGIgPSByci5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCk7Ci0JCQlieXRlW10gaCA9IG5ldyBieXRlW2IubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgaCwgMCwgYi5sZW5ndGgpOwotCQkJcnIuc2V0UHJvcGVydHkoSFRUUFJlcXVlc3QuSFRUUF9SRVNQT05TRV9IRUFERVIsIGgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SFRUUEJvZHkoYnl0ZVtdIGIpIHsKLQkJUmVxdWVzdCByciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKGlzUmVxdWVzdCk7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQlyci5zZXRQcm9wZXJ0eShIVFRQUmVxdWVzdC5IVFRQX1JFUVVFU1RfQk9EWSwgYik7Ci0JCWVsc2UKLQkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVTUE9OU0VfQk9EWSwgYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWUzNDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBIHJlc2VuZCBIVFRQIGNvbm5lY3Rpb24gd3JhcHMgYW4gSFRUUCBjb25uZWN0aW9uIHRvIHNlbmQgYW4gZXhpc3RpbmcgcmVxdWVzdC4KLSAqLwotcHVibGljIGNsYXNzIFJlc2VuZEhUVFBDb25uZWN0aW9uIGV4dGVuZHMgSFRUUENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBSZXF1ZXN0IGV4aXN0aW5nUmVxdWVzdDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyByZXNlbmQgY29ubmVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQQ29ubmVjdGlvbihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZXhpc3RpbmdSZXF1ZXN0ID0gcmVxdWVzdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuSFRUUENvbm5lY3Rpb24jZ2V0UmVxdWVzdFJlc3BvbnNlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRSZXF1ZXN0UmVzcG9uc2UoaW50IGkpIHsKLQkJcmV0dXJuIGV4aXN0aW5nUmVxdWVzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQ4ODU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlNvY2tldFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBXcmFwcyBhbiBleGlzdGluZyByZXF1ZXN0IHRvIGNyZWF0ZSBhbiBIVFRQIHJlcXVlc3QgdGhhdCBjYW4gYmUgc2VudC4gVGhlCi0gKiByZXNwb25zZSBpcyBpZ25vcmVkLiBPbmx5IHRoZSByZXF1ZXN0IGlzIGltcG9ydGFudCBpbiB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlbmRIVFRQUmVxdWVzdCBleHRlbmRzIEhUVFBSZXF1ZXN0IHsKLQlwcml2YXRlIGJvb2xlYW4gc2VudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBieXRlW10gaGVhZGVyOwotCi0JcHJpdmF0ZSBieXRlW10gY29udGVudDsKLQotCXByaXZhdGUgUmVxdWVzdCBvcmlnaW5hbFJlcXVlc3QgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gcmVxIHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50LgotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKG1vbml0b3IsIHJlcS5nZXRMb2NhbFBvcnQoKSwgcmVxLmdldFJlbW90ZUhvc3QoKSwgcmVxLmdldFJlbW90ZVBvcnQoKSk7Ci0JCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIsIHJlcS5nZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfSEVBREVSKSk7Ci0JCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZLCByZXEuZ2V0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0JPRFkpKTsKLQkJaGVhZGVyID0gcmVxLmdldFJlcXVlc3QoVFJBTlNQT1JUKTsKLQkJY29udGVudCA9IHJlcS5nZXRSZXF1ZXN0KENPTlRFTlQpOwotCQlyZXF1ZXN0ID0gcmVxLmdldFJlcXVlc3QoQUxMKTsKLQkJbmFtZSA9IHJlcS5nZXROYW1lKCk7Ci0JCXRoaXMub3JpZ2luYWxSZXF1ZXN0ID0gcmVxOwotCX0KLQotCS8qKgotCSAqIFNlbmQgdGhlIHJlcXVlc3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VuZFJlcXVlc3QoKSB7Ci0JCXRyeSB7Ci0JCQlTb2NrZXQgaW5Tb2NrZXQgPSBuZXcgU29ja2V0V3JhcHBlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdCkpOwotCQkJU29ja2V0IG91dFNvY2tldCA9IG5ldyBTb2NrZXQocmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7Ci0JCQkvL0Nvbm5lY3Rpb24gY29ubiA9IG5ldyBDb25uZWN0aW9uKGluU29ja2V0LCBvdXRTb2NrZXQpOwotCQkJLy9UQ1BJUFRocmVhZCByZXF1ZXN0VGhyZWFkID0gbmV3IFRDUElQVGhyZWFkKGNvbm4sIHRoaXMsIGluLAotCQkJLy8gb3V0U29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJCS8vcmVxdWVzdFRocmVhZC5zdGFydCgpOwotCQkJLy9uZXcgVENQSVBUaHJlYWQoY29ubiwgdGhpcywgb3V0U29ja2V0LmdldElucHV0U3RyZWFtKCksCi0JCQkvLyBpblNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgZmFsc2UpLnN0YXJ0KCk7Ci0JCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW5Tb2NrZXQsIG91dFNvY2tldCk7Ci0JCQlSZXNlbmRIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IFJlc2VuZEhUVFBDb25uZWN0aW9uKHRoaXMpOwotCi0JCQlIVFRQVGhyZWFkIHJlcXVlc3QyID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIGluU29ja2V0LmdldElucHV0U3RyZWFtKCksCi0JCQkJCW91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgdHJ1ZSwgcmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7Ci0JCQlIVFRQVGhyZWFkIHJlc3BvbnNlMiA9IG5ldyBIVFRQVGhyZWFkKGNvbm4yLCBvdXRTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwKLQkJCQkJaW5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGNvbm4sIGZhbHNlLCAibG9jYWxob3N0IiwgbG9jYWxQb3J0LCByZXF1ZXN0Mik7Ci0JCQlyZXF1ZXN0Mi5zdGFydCgpOwotCQkJcmVzcG9uc2UyLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3BvbnNlID0gKCJVbmFibGUgdG8gcmVzZW5kIHRvIHNlcnZlci5cbiIgKyBlKS5nZXRCeXRlcygpOwotCQl9Ci0JCXNlbnQgPSB0cnVlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSZXF1ZXN0I2FkZFRvUmVxdWVzdChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7Ci0JCS8vIERvbid0IHdhbnQgdG8gYWRkIHRvIHRoZSByZXF1ZXN0IGFzIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVxdWVzdC4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQmVlblNlbnQoKSB7Ci0JCXJldHVybiBzZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCwgaW50IHR5cGUpIHsKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXJlcXVlc3QgPSBuZXcgYnl0ZVswXTsKLQkJaWYgKHR5cGUgPT0gVFJBTlNQT1JUKQotCQkJaGVhZGVyID0gcmVxdWVzdDsKLQkJZWxzZSBpZiAodHlwZSA9PSBDT05URU5UKQotCQkJY29udGVudCA9IHJlcXVlc3Q7Ci0JCQotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaW50IGhlYWRlckxlbmd0aCA9IDA7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJbGVuZ3RoICs9IGhlYWRlci5sZW5ndGg7Ci0JCQloZWFkZXJMZW5ndGggPSBsZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWxlbmd0aCArPSBjb250ZW50Lmxlbmd0aDsKLQkJYnl0ZVtdIG5ld1JlcXVlc3QgPSBuZXcgYnl0ZVtsZW5ndGhdOwotCQlpZiAoaGVhZGVyICE9IG51bGwpCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlciwgMCwgbmV3UmVxdWVzdCwgMCwgaGVhZGVyLmxlbmd0aCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnQsIDAsIG5ld1JlcXVlc3QsIGhlYWRlckxlbmd0aCwgY29udGVudC5sZW5ndGgpOwotCQlzdXBlci5zZXRSZXF1ZXN0KG5ld1JlcXVlc3QpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBIVFRQUmVxdWVzdCNnZXRSZXF1ZXN0Q29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIEhUVFBSZXF1ZXN0I2dldFJlcXVlc3RIZWFkZXIoKQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKLQkJcmV0dXJuIGhlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdCBnZXRPcmlnaW5hbFJlcXVlc3QoKSB7Ci0JCXJldHVybiBvcmlnaW5hbFJlcXVlc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudEZpbHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2RmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudEZpbHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLS8qKgotICogQSBjb250ZW50IGZpbHRlciB0aGF0IGZpbHRlcnMgY29udGVudHMgZnJvbSB0aGUgbW9uaXRvciB0cmFmZmljIG9uIGEgcmVxdWVzdC4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jb250ZW50RmlsdGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIGF1dG9tYXRpY2FsbHkgdG8gaW5zdGFudGlhdGUgdGhlIGRlbGVnYXRlIHdoZW4gcmVxdWlyZWQuIAotICogPC9wPgotICogPHA+Ci0gKiBbaXNzdWU6IFRoZSBub3Rpb24gb2YgY29udGVudCBmaWx0ZXJzIGlzIGEgVUkvcHJlc2VudGF0aW9uCi0gKiBjb25jZXJuLCBub3Qgc29tZXRoaW5nIHRoYXQgaXMgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhcyBjb3JlCi0gKiBmdW5jdGlvbmFsaXR5LiBUaGUgY29udGVudEZpbHRlcnMgZXh0ZW5zaW9uIHBvaW50LCBJQ29udGVudEZpbHRlciwKLSAqIGFuZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgc2hvdWxkIGFsbCBtb3ZlIHRvIHRoZSBvLmUud3N0LmludGVybmV0Lm1vbml0b3IudWkKLSAqIHBsdWctaW4uXQotICogW2lzc3VlOiBDUyAtIEknZCBlY2hvIHRoZSBjb21tZW50IGFib3ZlIHRoYXQgdGhpcyBzZWVtcyBsaWtlIGEgVUkgY29uY2Vybi4gIAotICogSSBub3RpY2VkIHRoZXJlJ3MgYWxzbyBhIHZpZXdlciBvbiB0aGUgVUkgc2lkZSwgc28gaSdtIG5vdCBzdXJlIGhvdyB0aGVzZSB3b3VsZCBpbnRlcmFjdC4gCi0gKiBJIGFzc3VtZSB0aGF0IGZpbHRlcnMgb3BlcmF0ZSBvbiB0aGUgYnl0ZSBzdHJlYW0gYW5kIGFyZW4ndCBjb25jZXJuZWQgd2l0aCBVSSBwcmVzZW50YXRpb24uLi4KLSAqIGJ1dCB1c3VhbGx5IFVJJ3MgYW5kIGZpbHRlcnMgYXJlIHRpZ2h0bHkgY291cGxlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogRmlsdGVyIHRoZSBnaXZlbiBjb250ZW50IGZyb20gdGhlIGdpdmVuIHJlcXVlc3QuIFRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gZmlsdGVyZWQgb3V0IHdpbGwgCi0JICogbm90IGJlIHNob3duIHRvIGNsaWVudHMgb2YgdGhlIFRDUC9JUCBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgdGhlIGZpbHRlciB3aWxsIGJlIHBlcmZvcm1lZCBvbgotCSAqIEBwYXJhbSBpc1JlcXVlc3Qgc2V0IHRvIHRydWUgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gcmVxdWVzdCBtb25pdG9yIHRyYWZmaWMsCi0JICogICAgb3Igc2V0IHRvIGZhbHNlIGlmIHRoZSBjb250ZW50IGZpbHRlciBhcHBsaWVzIHRvIHRoZSByZXNwb25zZSBtb25pdG9yIHRyYWZmaWMKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgbWVzc2FnZSBjb250ZW50IHRvIGJlIGZpbHRlcmVkIG91dAotCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGNvbnRlbnQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgb3IgZmlsdGVyaW5nIHRoZSBjb250ZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBmaWx0ZXIoUmVxdWVzdCByZXF1ZXN0LCBib29sZWFuIGlzUmVxdWVzdCwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdmMTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgbW9uaXRvciBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuCi0gKiBUaGUgbW9uaXRvciB3YXRjaGVzIGFsbCBuZXR3b3JrIHRyYWZmaWMgYmV0d2VlbiBhIGxvY2FsIGNsaWVudCAodGFsa2luZwotICogb24gYSBnaXZlbiBsb2NhbCBwb3J0KSBhbmQgYSByZW1vdGUgc2VydmVyIChpZGVudGlmaWVkIGJ5IGhvc3QgYW5kIHBvcnQpLgotICogVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG1vbml0b3JzIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rIE1vbml0b3JDb3JlI2dldE1vbml0b3JzKCl9LgotICogSU1vbml0b3IgaXMgdGhyZWFkLXNhZmUuCi0gKiA8cD4KLSAqIElNb25pdG9ycyBhcmUgcmVhZC1vbmx5LiBUbyBtYWtlIGNoYW5nZXMgdG8gYSBtb25pdG9yLCB5b3UgbXVzdCBjcmVhdGUgYW4KLSAqIElNb25pdG9yV29ya2luZ0NvcHkgYnkgY2FsbGluZyBjcmVhdGVXb3JraW5nQ29weSgpLiBDaGFuZ2VzIHRvIHRoZSB3b3JraW5nIGNvcHkKLSAqIGFyZSBhcHBsaWVkIHdoZW4gdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gTW9uaXRvcnMgYW5kIG1vbml0b3Igd29ya2luZyBjb3BpZXMKLSAqIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotICogICAqIGVxdWFscygpIHJldHVybnMgdHJ1ZSBmb3IgYSBtb25pdG9yIGFuZCBpdCdzIHdvcmtpbmcgY29weQotICogPHA+Ci0gKiBbaXNzdWU6IFdoeSB0aGUgYnVpbHQtaW4gYXNzdW1wdGlvbiB0aGF0IHRoZSBjbGllbnQgaXMgbG9jYWw/IEEgbW9uaXRvcgotICogd291bGQgbWFrZSBqdXN0IGFzIG11Y2ggc2Vuc2Ugc2l0dGluZyBiZXR3ZWVuIGEgY2xpZW50IG9uIGEgcmVtb3RlIG1hY2hpbmUKLSAqIGFuZCBhIHNlcnZlci5dCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgbW9uaXRvci4KLQkgKiBFYWNoIG1vbml0b3IgaGFzIGEgZGlzdGluY3QsIGZpeGVkIGlkLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwotCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9uaXRvciBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciBiZWluZyBtb25pdG9yZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIGJlaW5nIG1vbml0b3JlZC4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWwgcG9ydCBudW1iZXIgb2YgdGhlIGNsaWVudCBiZWluZyBtb25pdG9yZWQuIFRoaXMKLQkgKiBpcyB0aGUgcG9ydCB0aGF0IHRoZSBjbGllbnQgaXMgdGFsa2luZyB0byB0aGUgcmVtb3RlIHNlcnZlciBvbi4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbG9jYWwgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3RvY29sIHRoYXQgdGhpcyBtb25pdG9yIHVzZXMgdG8gcmVhZCBuZXR3b3JrCi0JICogdHJhZmZpYy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm90b2NvbCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gdGltZW91dCAoaW4gbXMpLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gdGltZW91dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aW1lb3V0Ci0JICovCi0JcHVibGljIGludCBnZXRUaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtb25pdG9yIHN0YXJ0cyBieSBkZWZhdWx0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vbml0b3Igc2hvdWxkIGJlIHN0YXJ0ZWQgYnkgZGVmYXVsdCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuIE1vbml0b3Igd29ya2luZwotCSAqIGNvcGllcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgKHNpbmNlIHRoZXkgY2Fubm90IGJlIHJ1bikuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9uaXRvciBpcyBjdXJyZW50bHkgcnVubmluZywgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCk7Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGlzIG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSB0byBjbGllbnRzLgotCSAqIElmIHRoZSBtb25pdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nLCBpdCB3aWxsIGJlIHN0b3BwZWQgZmlyc3QuCi0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgbW9uaXRvciBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgb3IgaWYKLQkgKiBpdCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkuIENsaWVudHMgaGF2ZSBubyBvYmxpZ2F0aW9uIHRvIGRlbGV0ZQotCSAqIHdvcmtpbmcgY29waWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgYSB3b3JraW5nIGNvcHkuIE1vbml0b3JzIHdoaWNoIHJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgY2FzdCB0bwotCSAqIHtAbGluayBJTW9uaXRvcldvcmtpbmdDb3B5fS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9uaXRvciBpcyBhIHdvcmtpbmcgY29weSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgd29ya2luZyBjb3B5IGZvciB0aGlzIG1vbml0b3IuIElmIHRoZSByZWNlaXZlciBpcyBub3QgYQotCSAqIHdvcmtpbmcgY29weSwgYSBuZXcgd29ya2luZyBjb3B5IHdpbGwgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gaGF2ZQotCSAqIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYXMgdGhpcyBtb25pdG9yLiBJZiB0aGUgcmVjZWl2ZXIgaXMgYSB3b3JraW5nIGNvcHksCi0JICogdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIHJlY2VpdmVyLiBBZnRlciBjb25maWd1cmluZyBhdHRyaWJ1dGVzIG9uCi0JICogdGhlIHdvcmtpbmcgY29weSwgY2FsbGluZyB7QGxpbmsgSU1vbml0b3JXb3JraW5nQ29weSNzYXZlKCl9IGFwcGxpZXMKLQkgKiB0aGUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgd29ya2luZyBjb3B5IG9mIHRoaXMgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBnaXZlbiBtb25pdG9yIGxpc3RlbmluZyBvbiBpdHMgY2xpZW50IHBvcnQuIFRoaXMgbWV0aG9kIGlzCi0JICogc3luY2hyb25vdXMgYW5kIHRoZSBtb25pdG9yIHdpbGwgYmUgcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUKLQkgKiB0aW1lIHRoYXQgdGhlIG1ldGhvZCByZXR1cm5zLiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yCi0JICogaXMgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEEgQ29yZUV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1vbml0b3IgaXMgbm90IHZhbGlkLCB0aGUgbG9jYWwgcG9ydAotCSAqIGlzIGluIHVzZSwgb3IgaWYgYW5vdGhlciBwcm9ibGVtIG9jY3VycyB3aGVuIHN0YXJ0aW5nIHRoZSBtb25pdG9yLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5IG9yIGFmdGVyIHRoZSBtb25pdG9yCi0JICogaGFzIGJlZW4gZGVsZXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgbW9uaXRvcidzIHByb3BlcnRpZXMgYXJlIGludmFsaWQsCi0JICogICBpZiBpdCBmYWlscyB0byBzdGFydCBiZWNhdXNlIHRoZSBwb3J0IGlzIGluIHVzZSwgb3IgYW5vdGhlciBwcm9ibGVtIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgZ2l2ZW4gbW9uaXRvciBhbmQgZnJlZXMgdXAgYWxsIHVuZGVybHlpbmcgb3BlcmF0aW5nIAotCSAqIHN5c3RlbSByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9ub3VzIGFuZCB0aGUgbW9uaXRvciB3aWxsIGJlCi0JICogcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUgdGltZSB0aGF0IHRoZSBtZXRob2QgcmV0dXJucy4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yIHdhcyBub3QgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEFmdGVyIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgbW9uaXRvciBtYXkgYmUgcmVzdGFydGVkIGF0Ci0JICogYW55IHRpbWUuIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIHdvcmtpbmcgY29weSBvciBhZnRlcgotCSAqIHRoZSBtb25pdG9yIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKTsKLQotCS8qKgotCSAqIEFkZHMgYSByZXF1ZXN0IGxpc3RlbmVyLgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgbGlzdCBvZiByZXF1ZXN0cy4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIGEgd29ya2luZyBjb3B5LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQKLQkgKiB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4gSWYgdGhlIG1vbml0b3IgZG9lcyBub3QgZXhpc3QgeWV0ICh3aGVuIHRoZSB3b3JraW5nCi0JICogY29weSB3YXMganVzdCBjcmVhdGVkIGZyb20gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpKSwgdGhlIGxpc3RlbmVyIHdpbGwKLQkgKiBiZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBtb25pdG9yIHdoZW4gKGlmKSB0aGUgd29ya2luZyBjb3B5IGlzIHNhdmVkLiAKLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHJlcXVlc3QgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcmVxdWVzdCBsaXN0ZW5lci4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMKLQkgKiBub3QgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIHJlbW92ZWQgZnJvbSBhIHdvcmtpbmcgY29weSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9yaWdpbmFsIG1vbml0b3IuIFJlbW92aW5nIGEgbW9uaXRvciBmcm9tCi0JICogYSBuZXdseSBjcmVhdGVkIG1vbml0b3IgaGFzIG5vIGVmZmVjdCB1bmxlc3MgdGhlIG1vbml0b3IgaGFkIGFscmVhZHkgYmVlbgotCSAqIGFkZGVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHJlbW92ZWQgZnJvbSBub3RpZmljYXRpb24gYW5kIHdpbGwgbm90IGJlIGFkZGVkCi0JICogdG8gdGhlIGNyZWF0ZWQgbW9uaXRvciB3aGVuIChpZikgdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgbW9uaXRvci4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGUgbW9uaXRvcgotCSAqIGhhcyBpbnZhbGlkIHBvcnRzIG9yIHJlbW90ZSBob3N0bmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3Qgb24gdGhlIHdvcmtpbmcgY29weSBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiBiZSB2YWxpZGF0ZWQKLQkgKiBhdCBhbnkgdGltZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgcnVudGltZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgIHdyb25nIHdpdGggaXQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjOTQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLS8qKgotICogTGlzdGVuZXIgZm9yIGdsb2JhbCBjaGFuZ2VzIGFmZmVjdGluZyBtb25pdG9ycy4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCByZWdpc3RlcgotICogdGhlaXIgbGlzdGVuZXIgdmlhIHtAbGluayBNb25pdG9yQ29yZSNhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcil9LgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yTGlzdGVuZXIgewotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQgKGFkZGVkIHRvIHRoZQotCSAqIGdsb2JhbCBsaXN0IG9mIGtub3duIG1vbml0b3JzKS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbmV3bHktY3JlYXRlZCBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIG1vbml0b3IgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgaXMgbmV2ZXIgYSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgZ2l2ZW4gbW9uaXRvciBoYXMgYmVlbiBkZWxldGVkIChyZW1vdmVkCi0JICogZnJvbSB0aGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gbW9uaXRvcnMpLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgaGFzIGJlZW4gZGVsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc0MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0vKioKLSAqIFJlcHJlc2VudHMgYSB3b3JraW5nIGNvcHkgb2YgYSBtb25pdG9yLiBBIHdvcmtpbmcgY29weSBpcyBhIGNvcHkgdGhhdCB0aGUKLSAqIGF0dHJpYnV0ZXMgY2FuIGJlIGNoYW5nZWQuCi0gKiBJTW9uaXRvcldvcmtpbmdDb3B5IGlzIHRocmVhZC1zYWZlLiBIb3dldmVyLCB3b3JraW5nIGNvcGllcyBpbnN0YW5jZXMKLSAqIHNob3VsZCBiZSBzaG9ydC1saXZlZCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBtdWx0aXBsZSB3b3JraW5nIGNvcGllcwotICogYmVpbmcgY3JlYXRlZCBieSBkaWZmZXJlbnQgY2xpZW50cyBhbmQgb25lIGNsaWVudCBvdmVyd3JpdHRpbmcgY2hhbmdlcwotICogbWFkZSB0byB0aGUgb3RoZXIgd29ya2luZyBjb3B5LiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAc2VlIElNb25pdG9yCi0gKiAKLSAqIFtpc3N1ZSA6IENTIC0gaXQgc291bmRzIGxpa2UgdGhpcyBpcyBzb21ldGhpbmcgdXNlZnVsIGZvciBjcmVhdGluZyBtb25pdG9ycy4gCi0gKiBTaG91bGRuJ3QgdGhpcyBiZSBjYWxsZWQgYSBJTW9uaXRvckNvbmZpZ3VyYXRpb24/ICBJcyB0aGVyZSBhbiBhZHZhbnRhZ2UgdG8gbWFraW5nCi0gKiB0aGlzIGFjdHVhbGx5IHNlZW0gdG8gYmUgYSBJTW9uaXRvcj8gIFBlcmhhcHMgc29tZSBVSSBjb252ZW5pZW5jZT8gIAotICogSXMgYSBJTW9uaXRvcldvcmtpbmdDb3B5IGFjdHVhbGx5ICd1c2VhYmxlJyBmb3IgbW9uaXRvcmluZyAuLiBvciBpcyBpdCByZWFsbHkganVzdCBhIGNvbmZpZ3VyYXRpb24/IF0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9uaXRvcldvcmtpbmdDb3B5IGV4dGVuZHMgSU1vbml0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yaWdpbmFsIG1vbml0b3IgdGhhdCB0aGlzIHdvcmtpbmcgY29weSBjb3JyZXNwb25kcyB0bywgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHdvcmtpbmcgY29weSB3YXMganVzdCBjcmVhdGVkIGZyb20KLQkgKiBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCkuCi0JICogCi0JICogQHJldHVybiB0aGUgb3JpZ2luYWwgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkKLQkgKiAgICB3YXMganVzdCBjcmVhdGVkCi0JICovCi0JcHVibGljIElNb25pdG9yIGdldE9yaWdpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb2NhbCBwb3J0IG51bWJlciBvZiB0aGUgY2xpZW50IHRvIGJlIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbG9jYWwgKGNsaWVudCkgcG9ydCBudW1iZXIKLQkgKiBAc2VlIElNb25pdG9yI2dldExvY2FsUG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxQb3J0KGludCBwb3J0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbW90ZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciB0byBiZSBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIGhvc3QgdGhlIG5ldyByZW1vdGUgaG9zdCBuYW1lCi0JICogQHNlZSBJTW9uaXRvciNnZXRSZW1vdGVIb3N0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVIb3N0KFN0cmluZyBob3N0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbW90ZSBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIHRvIGJlIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbmV3IHJlbW90ZSBwb3J0IG51bWJlcgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlUG9ydChpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm90b2NvbCB0byBiZSB1c2VkIHRvIHJlYWQgbmV0d29yawotCSAqIHRyYWZmaWMgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm90b2NvbElkIHRoZSBwcm90b2NvbCBpZAotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbElkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbm5lY3Rpb24gdGltZW91dCAoaW4gbXMpLiBVc2UgMCB0byBjbGVhciB0aGUgdGltZW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGltZW91dCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0Ci0JICogQHNlZSBJTW9uaXRvciNnZXRUaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGlzIG1vbml0b3Igc3RhcnRzIGJ5IGRlZmF1bHQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0QnlEZWZhdWx0IHJ1biB0aGUgbW9uaXRvciBvbiBwbHVnLWluIHN0YXJ0dXAKLQkgKiBAc2VlIElNb25pdG9yI2lzQXV0b1N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvU3RhcnQoYm9vbGVhbiBzdGFydEJ5RGVmYXVsdCk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoaXMgd29ya2luZyBjb3B5LgotCSAqIEZvciBhIGJyYW5kIG5ldyB3b3JraW5nIGNvcHkgKGNyZWF0ZWQgYnkKLQkgKiB7QGxpbmsgTW9uaXRvckNvcmUjY3JlYXRlTW9uaXRvcigpfSwgYW5kIG5vdCB5ZXQgc2F2ZWQpLCB0aGlzIG1ldGhvZAotCSAqIGNyZWF0ZXMgYSBuZXcgbW9uaXRvciBpbnN0YW5jZSB3aXRoIGF0dHJpYnV0ZXMgbWF0Y2hpbmcgdGhpcyB3b3JraW5nIGNvcHkuCi0JICogRm9yIGEgd29ya2luZyBjb3B5IGNsb25lZCBmcm9tIGFuIGV4aXN0aW5nIG1vbml0b3IgaW5zdGFuY2UgKGJ5Ci0JICoge0BsaW5rIElNb25pdG9yI2NyZWF0ZVdvcmtpbmdDb3B5KCl9KSwgdGhpcyBtZXRob2Qgc3RvcHMgdGhlIGV4aXN0aW5nCi0JICogbW9uaXRvciAodXNpbmcge0BsaW5rIElNb25pdG9yI3N0b3AoKX0pIGlmIG5lY2Vzc2FyeSwKLQkgKiBhbmQgdGhlbiBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb25pdG9yIGluc3RhbmNlIHRvIG1hdGNoIHRoaXMKLQkgKiB3b3JraW5nIGNvcHkgKHRoZSBtb25pdG9yIGluc3RhbmNlIGlzIHJldHVybmVkKS4KLQkgKiA8cD4KLQkgKiBTYXZpbmcgYSB3b3JraW5nIGNvcHkgZm9yIGEgbW9uaXRvciB0aGF0IHdhcyBhbHJlYWR5IGRlbGV0ZWQgd2lsbCBjYXVzZQotCSAqIHRoZSBtb25pdG9yIHRvIGdldCByZWNyZWF0ZWQgKHdpdGggYW55IGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgY29weSkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHRocm93cyBhIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNhdmluZyB0aGUKLQkgKiBtb25pdG9yLiBObyB2YWxpZGF0aW9uIGNoZWNrcyBvY2N1ciB3aGVuIHNhdmluZyB0aGUgbW9uaXRvci4gVGhpcyBjYW4gYmUKLQkgKiBkb25lIGJ5IGNhbGxpbmcgSU1vbml0b3IudmFsaWRhdGUoKSBwcmlvciB0byBzYXZpbmcuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgYWZmZWN0ZWQgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBzYXZpbmcgdGhlIG1vbml0b3IgCi0JICovCi0JcHVibGljIElNb25pdG9yIHNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JUmVxdWVzdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JUmVxdWVzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMGM1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVJlcXVlc3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLS8qKgotICogTGlzdGVuZXIgZm9yIG5ldyBvciBtb2RpZmllZCByZXF1ZXN0cyBjcmVhdGVkIGZyb20gYSBzaW5nbGUgbW9uaXRvci4KLSAqIEVhY2ggcmVxdWVzdCByZXByZXNlbnRzIG1lc3NhZ2UgdHJhZmZpYyBiZXR3ZWVuIGEgbW9uaXRvcmVkIGNsaWVudAotICogYW5kIHNlcnZlci4KLSAqIDxwPgotICogUmVxdWVzdHMgYXJlIG5vdCBwZXJzaXN0ZWQgLSB0aGV5IG9ubHkgZXhpc3QgaW4gdGhpcyBBUEkgdW50aWwgdGhlCi0gKiBjb25uZWN0aW9uIGlzIGRvbmUuIEFuIGluaXRpYWwgcmVxdWVzdEFkZGVkKCkgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUKLSAqCXJlcXVlc3QgaXMgY3JlYXRlZCAoYnkgdGhlIGNsaWVudCBjcmVhdGluZyBhIGNvbm5lY3Rpb24pLCBhbmQgdGhlbgotICogcmVxdWVzdENoYW5nZWQoKSBldmVudHMgb2NjdXIgYXMgZGF0YSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcmVxdWVzdAotICogb3IgY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgcmVxdWVzdCdzIHByb3BlcnRpZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSU1vbml0b3IjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcXVlc3RMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogUmVxdWVzdHMgbWF5IGJlIGNyZWF0ZWQgd2l0aCBsaXR0bGUgdG8gbm8gZGF0YSBpbiB0aGVtLgotCSAqIEFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUKLQkgKiA8Y29kZT5yZXF1ZXN0Q2hhbmdlZDwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCB3YXMgaW5pdGlhdGVkCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCBoYXMgYmVlbiBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RBZGRlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3QgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZQotCSAqIHJlcXVlc3QuCi0JICogPHA+Ci0JICogSW5kaXZpZHVhbCB2YWx1ZXMgd2l0aGluIHRoZSByZXF1ZXN0IGFyZSByYXJlbHkgbW9kaWZpZWQuCi0JICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIGluaXRpYWxseSBzZXQgb3IKLQkgKiB3aGVuIG1vcmUgZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgb3Igc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBpbml0aWF0ZWQKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2hhbmdlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvckNvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTQ4ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvckNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JNYW5hZ2VyOwotLyoqCi0gKiBNYWluIGNsYXNzIGZvciBjcmVhdGluZyBuZXcgbW9uaXRvcnMgYW5kIGxvY2F0aW5nIGV4aXN0aW5nIG9uZXMuIFRoZSBtZXRob2RzIG9uCi0gKiB0aGlzIGNsYXNzIGFyZSB0aHJlYWQgc2FmZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLiBJdCBpcyBub3QgaW50ZW5kZWQKLSAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvckNvcmUgewotCXByaXZhdGUgc3RhdGljIE1vbml0b3JNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY3JlYXRlIE1vbml0b3JDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgTW9uaXRvckNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtb25pdG9yIG1hbmFnZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9uaXRvciBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCW1hbmFnZXIgPSBNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gbW9uaXRvciBpbnN0YW5jZXMuIFRoZSBsaXN0IHdpbGwgbm90IGNvbnRhaW4gYW55Ci0JICogd29ya2luZyBjb3BpZXMgYW5kIGlzIHBlcnNpc3RlZCBiZXR3ZWVuIHdvcmtiZW5jaCBzZXNzaW9ucy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGw7IGNsaWVudHMgbWF5IHNhZmVseSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vbml0b3IgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9uaXRvcltdIGdldE1vbml0b3JzKCkgewotCQlMaXN0PElNb25pdG9yPiBsaXN0ID0gZ2V0TWFuYWdlcigpLmdldE1vbml0b3JzKCk7Ci0JCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gQWZ0ZXIgY29uZmlndXJpbmcgcGFyYW1ldGVycyBvbgotCSAqIHRoZSB3b3JraW5nIGNvcHksIGNhbGxpbmcge0BsaW5rIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpfSBicmluZ3MKLQkgKiB0aGUgbW9uaXRvciBpbnRvIGV4aXN0ZW5jZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB7QGxpbmsgSU1vbml0b3IjZGVsZXRlKCl9Ci0JICogdG8gZGVsZXRlIHRoZSBtb25pdG9yIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBtb25pdG9ycyBhcmUgY3JlYXRlZCwgdGhlIGxvY2FsIGFuZCByZW1vdGUgcG9ydCB2YWx1ZXMgZGVmYXVsdCB0bwotCSAqIDxjb2RlPjgwPC9jb2RlPiwgYnV0IHRoZXkgZG8gbm90IGhhdmUgYSBwcm90b2NvbCBvciByZW1vdGUgaG9zdCAodmFsdWVzCi0JICogYXJlIDxjb2RlPm51bGw8L2NvZGU+KS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEByZXR1cm4gYSBtb25pdG9yIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewotCQlyZXR1cm4gZ2V0TWFuYWdlcigpLmNyZWF0ZU1vbml0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbW9uaXRvciBsaXN0ZW5lci4KLQkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCi0JICogY2hhbmdlcyB0byB0aGUgbW9uaXRvcnMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG1vbml0b3IgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWdldE1hbmFnZXIoKS5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG1vbml0b3IgbGlzdGVuZXIuIEhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJZ2V0TWFuYWdlcigpLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmViZDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBUQ1AvSVAgcmVxdWVzdCBtYWRlIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLSAqIEVhY2ggcmVxdWVzdCByZXByZXNlbnRzIGEgcmVxdWVzdC1yZXNwb25zZSBwYWlyLCB3aGVyZSB0aGUgcmVxdWVzdAotICogaXMgZnJvbSBjbGllbnQgLT4gc2VydmVyLCBhbmQgdGhlIHJlc3BvbnNlIGlzIGZyb20gc2VydmVyIC0+IGNsaWVudC4KLSAqIDxwPgotICogUmVxdWVzdHMgYXJlIGNyZWF0ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuIFRoZXkgZG8gbm90IGhhdmUgYSByZWZlcmVuY2UKLSAqIGJhY2sgdG8gdGhlIG1vbml0b3IgYmVjYXVzZSB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbW9kaWZpZWQKLSAqIHNpbmNlIHRoZSByZXF1ZXN0IHdhcyBjcmVhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cHJvdG9jb2xBZGFwdGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LiAKLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQlwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOwotCXByb3RlY3RlZCBEYXRlIGRhdGU7Ci0JcHJvdGVjdGVkIGxvbmcgcmVzcG9uc2VUaW1lID0gLTE7Ci0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGVIb3N0OwotCXByb3RlY3RlZCBpbnQgcmVtb3RlUG9ydDsKLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlcXVlc3Q7Ci0JcHJvdGVjdGVkIGJ5dGVbXSByZXNwb25zZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbElkOwotCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKLQkKLQkvKioKLQkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDEpIGZvciB0aGUgdHJhbnNwb3J0IChoZWFkZXIpIG9mIGEgcmVxdWVzdAotCSAqIG9yIHJlc3BvbnNlLgotCSAqIAotCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQotCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BPUlQgPSAxOwotCi0JLyoqCi0JICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAyKSBmb3IgdGhlIGNvbnRlbnQgKGJvZHkpIG9mIGEgcmVxdWVzdAotCSAqIG9yIHJlc3BvbnNlLgotCSAqIAotCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQotCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UID0gMjsKLQotCS8qKgotCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMykgZm9yIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIHJlcXVlc3QKLQkgKiBvciByZXNwb25zZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRSZXF1ZXN0KGludCkKLQkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBSZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEBwYXJhbSBwcm90b2NvbElkIHRoZSBwcm90b2NvbCBpZAotCSAqIEBwYXJhbSBsb2NhbFBvcnQgYSBsb2NhbCBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSByZW1vdGVIb3N0IGEgcmVtb3RlIGhvc3RuYW1lCi0JICogQHBhcmFtIHJlbW90ZVBvcnQgYSByZW1vdGUgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm90b2NvbElkLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJdGhpcy5wcm90b2NvbElkID0gcHJvdG9jb2xJZDsKLQkJdGhpcy5sb2NhbFBvcnQgPSBsb2NhbFBvcnQ7Ci0JCXRoaXMucmVtb3RlSG9zdCA9IHJlbW90ZUhvc3Q7Ci0JCXRoaXMucmVtb3RlUG9ydCA9IHJlbW90ZVBvcnQ7Ci0JCWRhdGUgPSBuZXcgRGF0ZSgpOwotCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYWRkUmVxdWVzdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyByZXF1ZXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3RvY29sIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJcmV0dXJuIHByb3RvY29sSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZSB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCAoY2xpZW50KSBwb3J0LgotCSAqCi0JICogQHJldHVybiB0aGUgbG9jYWwgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLQkJcmV0dXJuIGxvY2FsUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgKHNlcnZlcikgaG9zdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBob3N0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewotCQlyZXR1cm4gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgKHNlcnZlcikgcG9ydC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKLQkJcmV0dXJuIHJlbW90ZVBvcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGVudCBvZiB0aGUgcmVxdWVzdCBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAotCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gdHJhbnNwb3J0IGFuZCBjb250ZW50IGlzIGlnbm9yZWQuCi0JICogRm9yIEhUVFAgcmVxdWVzdHMsIHRoaXMgVFJBTlNQT1JUIHJldHVybnMganVzdCB0aGUgSFRUUCBoZWFkZXIgYW5kIAotCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAotCSAqIGl0IG1lYW4gZm9yIG90aGVyIHByb3RvY29scz8KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgY29udGVudCB0eXBlOiBvbmUgb2Yge0BsaW5rICNUUkFOU1BPUlR9LAotCSAqICAgIHtAbGluayAjQ09OVEVOVH0sIG9yIHtAbGluayAjQUxMfQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgYnl0ZXMKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUpIHsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGVudCBvZiB0aGUgcmVzcG9uc2UgcG9ydGlvbiBvZiB0aGlzIHJlcXVlc3QuCi0JICogPHA+Ci0JICogW2lzc3VlOiBJIGRvbid0IGtub3cgaG93IHRvIGV4cGxhaW4gdGhpcy4gRm9yIGJhc2ljIFRDUC9JUCByZXF1ZXN0cywKLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRyYW5zcG9ydCBhbmQgY29udGVudCBpcyBpZ25vcmVkLgotCSAqIEZvciBIVFRQIHJlcXVlc3RzLCB0aGlzIFRSQU5TUE9SVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgaGVhZGVyIGFuZCAKLQkgKiBDT05URU5UIHJldHVybnMganVzdCB0aGUgSFRUUCBib2R5IHdpdGhvdXQgdGhlIGhlYWRlcnMuIFdoYXQgd291bGQKLQkgKiBpdCBtZWFuIGZvciBvdGhlciBwcm90b2NvbHM/XQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSBjb250ZW50IHR5cGU6IG9uZSBvZiB7QGxpbmsgI1RSQU5TUE9SVH0sCi0JICogICAge0BsaW5rICNDT05URU5UfSwgb3Ige0BsaW5rICNBTEx9Ci0JICogQHJldHVybiB0aGUgY29udGVudCBieXRlcwotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2UoaW50IHR5cGUpIHsKLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBJZiB0aGUgcmVxdWVzdAotCSAqIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgeWV0LCAtMSBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRpbWUsIG9yIC0xIGlmIHRoZXJlIGhhcyBiZWVuIG5vCi0JICogICAgcmVzcG9uc2UgeWV0Ci0JICovCi0JcHVibGljIGxvbmcgZ2V0UmVzcG9uc2VUaW1lKCkgewotCQlyZXR1cm4gcmVzcG9uc2VUaW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuYW1lIGZvciB0aGlzIHJlcXVlc3QuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGdldFJlbW90ZUhvc3QoKSArICI6IiArIGdldFJlbW90ZVBvcnQoKTsKLQkJCi0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcmVxdWVzdC4KLQkgKgotCSAqIEBwYXJhbSBuIHRoZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgewotCQluYW1lID0gbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBrZXktdmFsdWUgcHJvcGVydHkgb24gdGhpcyByZXF1ZXN0LiBUbyByZW1vdmUgYSBwcm9wZXJ0eSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIG51bGwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSBwcm90b2NvbCBhZGFwdGVycyB0byBhdHRhY2ggcHJvdG9jb2wtCi0JICogc3BlY2lmaWMgZmllbGRzIHRvIHRoZSByZXF1ZXN0LCBidXQgaXQgbWF5IGJlIGNhbGxlZCBieSBhbnkgY2xpZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvcGVydGllcy5jb250YWluc0tleShrZXkpKQotCQkJCXByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBhZGQgcHJvcGVydHkiLCBlKTsKLQkJfQotCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGlzIHJlcXVlc3QuCi0JICogSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUgcHJvcGVydHkga2V5IAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRvIHRoZSByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIGFkZFJlcXVlc3QgYnl0ZVtdCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7Ci0JCWlmIChhZGRSZXF1ZXN0ID09IG51bGwgfHwgYWRkUmVxdWVzdC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlzZXRSZXF1ZXN0KGFkZFJlcXVlc3QpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWludCBzaXplID0gcmVxdWVzdC5sZW5ndGggKyBhZGRSZXF1ZXN0Lmxlbmd0aDsKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShyZXF1ZXN0LCAwLCBiLCAwLCByZXF1ZXN0Lmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVxdWVzdCwgMCwgYiwgcmVxdWVzdC5sZW5ndGgsIGFkZFJlcXVlc3QubGVuZ3RoKTsKLQkJcmVxdWVzdCA9IGI7Ci0JCWZpcmVDaGFuZ2VkRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIHJlc3BvbnNlLgotCSAqCi0JICogQHBhcmFtIGFkZFJlc3BvbnNlIGJ5dGVbXQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvUmVzcG9uc2UoYnl0ZVtdIGFkZFJlc3BvbnNlKSB7Ci0JCWlmIChhZGRSZXNwb25zZSA9PSBudWxsIHx8IGFkZFJlc3BvbnNlLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApIHsKLQkJCXNldFJlc3BvbnNlKGFkZFJlc3BvbnNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaW50IHNpemUgPSByZXNwb25zZS5sZW5ndGggKyBhZGRSZXNwb25zZS5sZW5ndGg7Ci0JCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzcG9uc2UsIDAsIGIsIDAsIHJlc3BvbnNlLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVzcG9uc2UsIDAsIGIsIHJlc3BvbnNlLmxlbmd0aCwgYWRkUmVzcG9uc2UubGVuZ3RoKTsKLQkJcmVzcG9uc2UgPSBiOwotCQlmaXJlQ2hhbmdlZEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIHJlcXVlc3QgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVzcG9uc2UuCi0JICoKLQkgKiBAcGFyYW0gcmVzcG9uc2UgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzcG9uc2UoYnl0ZVtdIHJlc3BvbnNlKSB7Ci0JCWlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQotCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0JCXJlc3BvbnNlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZGF0ZS5nZXRUaW1lKCk7Ci0JCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9uaXRvciB0aGF0IGNyZWF0ZWQgdGhpcyByZXF1ZXN0LgotCSAqIENoYW5nZSBldmVudHMgd2lsbCBiZSBmaXJlZCBmcm9tIHRoaXMgbW9uaXRvci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgbWF5IGhhdmUgYmVlbiBlZGl0dGVkIHNpbmNlIHRoaXMKLQkgKiByZXF1ZXN0IHdhcyBjcmVhdGVkLCBzbyB5b3UgY2Fubm90IHJlbHkgb24gdGhlIG1vbml0b3IncwotCSAqIGhvc3RuYW1lIG9yIHBvcnQgdmFsdWVzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgSU1vbml0b3IgZ2V0TW9uaXRvcigpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIGNoYW5nZSBldmVudCB0byBub3RpZnkgbW9uaXRvciBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ2hhbmdlZEV2ZW50KCkgewotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5yZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWVkNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIElNb25pdG9yIGludGVyZmFjZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgbW9uaXRvciwKLWFsbG93aW5nIHlvdSB0byBjaGFuZ2UgaXQgdmlhIGEgd29ya2luZyBjb3B5LCBzdGFydC9zdG9wIGl0LCBvciBhZGQgYSBsaXN0ZW5lcgotZm9yIHJlcXVlc3QgYWN0aXZpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0ZTA0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLTxhYnN0cmFjdD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9hYnN0cmFjdD4KLQotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotCi08cD5UaGUgSU1vbml0b3IgaW50ZXJmYWNlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBtb25pdG9yLAotYWxsb3dpbmcgeW91IHRvIGNoYW5nZSBpdCB2aWEgYSB3b3JraW5nIGNvcHksIHN0YXJ0L3N0b3AgaXQsIG9yIGFkZCBhIGxpc3RlbmVyCi1mb3IgcmVxdWVzdCBhY3Rpdml0eS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlNTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1Nb25pdG9yCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzPVByb3RvY29sIEFkYXB0ZXJzCi1leHRlbnNpb25Qb2ludENvbnRlbnRGaWx0ZXJzPUNvbnRlbnQgRmlsdGVycwotZXh0ZW5zaW9uUG9pbnRTdGFydHVwPVN0YXJ0dXAKLQotSFRUUD1IVFRQCi1UQ1BJUD1UQ1AvSVAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyNWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzIiBpZD0iaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9wcm90b2NvbEFkYXB0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50Q29udGVudEZpbHRlcnMiIGlkPSJpbnRlcm5hbENvbnRlbnRGaWx0ZXJzIiBzY2hlbWE9InNjaGVtYS9pbnRlcm5hbENvbnRlbnRGaWx0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50U3RhcnR1cCIgaWQ9ImludGVybmFsU3RhcnR1cCIgc2NoZW1hPSJzY2hlbWEvc3RhcnR1cC5leHNkIi8+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIj4KLSAgPHByb3RvY29sQWRhcHRlcgotICAgIGlkPSJUQ1AvSVAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVENQSVBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJVRDUElQIi8+Ci0gIDxwcm90b2NvbEFkYXB0ZXIKLSAgICBpZD0iSFRUUCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLkhUVFBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJUhUVFAiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL2ludGVybmFsQ29udGVudEZpbHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJkZDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJjb250ZW50RmlsdGVycyIgbmFtZT0iQ29udGVudCBGaWx0ZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZmlsdGVyIGNvbnRlbnQgcmVjZWl2ZWQgaW4gYSBtb25pdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWx0ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KLUNvbnRlbnQgZmlsdGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpbHRlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdXNlZCB0byBvcmRlciBmaWx0ZXJzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIExvd2VyIG9yZGVycyBhcmUgcHJvY2Vzc2VkIGZpcnN0Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IGZpbHRlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmNvbnRlbnRGaWx0ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsdGVyCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlSWRlbnRpZmllciZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDslZXhhbXBsZU5hbWUmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVDb250ZW50RmlsdGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I4M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSIgaWQ9ImludGVybmFsUHJvdG9jb2xBZGFwdGVycyIgbmFtZT0iUHJvdG9jb2wgQWRhcHRlcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGFuIGFkYXB0ZXIgZm9yIGEgbmV3IHByb3RvY29sIChlLmcuIEhUVFApLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvdG9jb2xzIHRvIGJlIG1vbml0b3JlZCBpbiBhIHNwZWNpZmljIHdheS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3RvY29sQWRhcHRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvdG9jb2xBZGFwdGVyIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsNCi1Qcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHByb3RvY29sIGFkYXB0ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHByb3RvY29sIGFkYXB0ZXIgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBhIHByb3RvY29sIGFkYXB0ZXIgZm9yIFRDUC9JUDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5wcm90b2NvbEFkYXB0ZXJzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwcm90b2NvbEFkYXB0ZXINCi0gICAgICAgICAgICBpZD0mcXVvdDtUQ1BJUCZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLlRDUElQUHJvdG9jb2xBZGFwdGVyJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslVENQSVAmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBhYnN0cmFjdCBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlByb3RvY29sQWRhcHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3N0YXJ0dXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTkyZTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJpbnRlcm5hbFN0YXJ0dXAiIG5hbWU9IlN0YXJ0dXAiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBsb2FkIGEgc2Vjb25kYXJ5IHBsdWdpbi4gVGhlIGV4dGVuc2lvbiBwb2ludCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtb25pdG9yIGNvcmUgcGx1Z2luIHN0YXJ0cyB1cC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RhcnR1cCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXJ0dXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklTdGFydHVwIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnN0YXJ0dXBzJnF1b3Q7Jmd0OwotICAgICAgJmx0O3N0YXJ0dXAKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLm15cGx1Z2luJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5teXBsdWdpbi5TdGFydHVwJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjE2NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb25pdG9ydWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjY1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLW1vbml0b3J1aS5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpXzMuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDEyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODExNzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZmYTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTY6MjggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhiZTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vyczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywxLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZGRjZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gbW9uaXRvcnVpLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTk1NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9odHRwSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMGMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9odHRwSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUwYjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3Bpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM0ZTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzRmMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmOThjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9odHRwSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcxYThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvcGluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3Bpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjE1ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvcGluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTBjNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTk1NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvY2xlYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvaHR0cEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9odHRwSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMGMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9odHRwSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUwYjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Bpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYyYjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNGU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0ZTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3NGYxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9ob3N0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9ob3N0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU1ZjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjM5NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi90Y3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi90Y3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZlMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxZDFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotLyoqCi0gKiBDb25zdGFudCBpZHMgZm9yIGNvbnRleHQgaGVscC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfVFJFRSA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUVVFU1QgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVNQT05TRSA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDA2IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUYgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TSE9XID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTU9OSVRPUlMgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ESUFMT0cgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwNiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmQyMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdE1vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3RlSG9zdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdGVQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW90ZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3Rpb25UaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1dG9TdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZVR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNob3dWaWV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vbml0b3JMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblN0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5SZW1vdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5Mb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5BdXRvU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlYWRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltYWdlVmlld0ludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sVmlld0ludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdEYXRlRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZVRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1Jlc3BvbnNlVGltZUZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVzcG9uc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcXVlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTaXplRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkNsZWFyVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TaG93SGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblBpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9wZXJ0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBubzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDE0MTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIC0tLS0tLS0tLS0tLS0tLSBUQ1AvSVAgTW9uaXRvciB2aWV3IC0tLS0tLS0tLS0tLS0tLQotCi0jIExhYmVscwotdmlld1JlcXVlc3Q9UmVxdWVzdDogezB9Ci12aWV3UmVzcG9uc2U9UmVzcG9uc2U6IHswfQotdmlld1RpbWU9VGltZSBvZiByZXF1ZXN0OiB7MH0KLXZpZXdUeXBlPVR5cGU6IHswfQotdmlld1Jlc3BvbnNlVGltZT1SZXNwb25zZSBUaW1lOiB7MH0KLXZpZXdTaXplPVNpemU6IHswfQotdmlld1Jlc3BvbnNlVGltZUZvcm1hdD17MH0gbXMKLXZpZXdTaXplRm9ybWF0PXswfSAoezF9KSBieXRlcwotCi0jIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSB0aW1lIGZvcm1hdCBvZiB0aGUgVENQL0lQIG1vbml0b3IKLSMgdmlldy4gSXQgdXNlcyB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGZvdW5kIGluIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OgotIyAgIGsgLSBob3VyIGluIGRheSwgaCAtIGhvdXIgaW4gYW0vcG0sIG0gLSBtaW51dGUsIHMgLSBzZWNvbmQsIFMgLSBtaWxsaXNlY29uZCwKLSMgICBhIC0gYW0vcG0gbWFya2VyLiB1c2UgZHVwbGljYXRlIGNoYXJzIChlLmcuICdtbScpIHRvIGZpbGwgd2l0aCB6ZXJvcyAoaS5lLiAKLSMgICAnMDEnIGluc3RlYWQgb2YgJzEnKQotdmlld0RhdGVGb3JtYXQ9aDptbS5zLlMgYQotCi0jIEFjdGlvbnMKLWFjdGlvblNvcnRCeVJlc3BvbnNlVGltZT1Tb3J0IEJ5IFJlc3BvbnNlIFRpbWUKLWFjdGlvbkNsZWFyVG9vbFRpcD1DbGVhcgotYWN0aW9uU2hvd0hlYWRlcj1TaG93IEhlYWRlcgotYWN0aW9uUGluPVBpbiBTZWxlY3Rpb24KLWFjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcwotCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFJlcXVlc3RSZXNwb25zZSBWaWV3ZXJzIC0tLS0tLS0tLS0tLS0tLQotaGVhZGVyTGFiZWw9SGVhZGVyOiB7MH0KLWltYWdlVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIGltYWdlIGZpbGU+Ci14bWxWaWV3SW52YWxpZD08Tm90IGEgdmFsaWQgWE1MIGZpbGU+Ci1odG1sVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIEhUTUwgZmlsZT4KLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQotZXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIFVJIC0tLS0tLS0tLS0tLS0tLQotbW9uaXRvckxpc3Q9VENQL0lQICZNb25pdG9yczoKLWNvbHVtbkxvY2FsPUxvY2FsIFBvcnQKLWNvbHVtblJlbW90ZT1Ib3N0IG5hbWUKLWNvbHVtblR5cGU9VHlwZQotY29sdW1uU3RhdHVzPVN0YXR1cwotY29sdW1uQXV0b1N0YXJ0PUF1dG8tc3RhcnQKLWFkZD0mQWRkLi4uCi1lZGl0PSZFZGl0Li4uCi1yZW1vdmU9JlJlbW92ZQotc3RhcnQ9JlN0YXJ0Ci1zdG9wPVMmdG9wCi1zdGFydGVkPVN0YXJ0ZWQKLXN0b3BwZWQ9U3RvcHBlZAoteWVzPVllcwotbm89Tm8KLQotbmV3TW9uaXRvcj1OZXcgTW9uaXRvcgotZWRpdE1vbml0b3I9RWRpdCBNb25pdG9yCi0KLWxvY2FsUG9ydD0mTG9jYWwgbW9uaXRvcmluZyBwb3J0OgotcmVtb3RlR3JvdXA9TW9uaXRvcgotcmVtb3RlSG9zdD0mSG9zdCBuYW1lOgotcmVtb3RlUG9ydD0mUG9ydDoKLXBhcnNlVHlwZT0mVHlwZToKLWF1dG9TdGFydD0mU3RhcnQgbW9uaXRvciBhdXRvbWF0aWNhbGx5Ci1jb25uZWN0aW9uVGltZW91dD1UJmltZW91dCAoaW4gbWlsbGlzZWNvbmRzKToKLQotcHJlZmVyZW5jZURlc2NyaXB0aW9uPUNvbmZpZ3VyZSBUQ1AvSVAgbW9uaXRvcnMgb24gbG9jYWwgYW5kIHJlbW90ZSBwb3J0cy4KLXByZWZTaG93Vmlldz1TJmhvdyB0aGUgVENQL0lQIE1vbml0b3IgdmlldyB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODdiM2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIE1vbml0b3IgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogTW9uaXRvckNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLiAgCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIAotCSAqIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4gCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JfQotCi0JLyoKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKLQkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiYTg3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQlwcml2YXRlIFNwaW5uZXIgbW9uaXRvclBvcnQ7Ci0JcHJpdmF0ZSBMYWJlbCB2YWxpZGF0ZUxhYmVsOwotCi0JaW50ZXJmYWNlIFN0cmluZ01vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKTsKLQl9Ci0KLQlpbnRlcmZhY2UgQm9vbGVhbk1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGJvb2xlYW4gYik7Ci0JfQotCi0JaW50ZXJmYWNlIFR5cGVNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChJUHJvdG9jb2xBZGFwdGVyIHR5cGUpOwotCX0KLQotCWludGVyZmFjZSBJbnRNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3IgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJbW9uaXRvciA9IE1vbml0b3JDb3JlLmNyZWF0ZU1vbml0b3IoKTsKLQkJaXNFZGl0ID0gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGlzRWRpdCkKLQkJCXNoZWxsLnNldFRleHQoTWVzc2FnZXMuZWRpdE1vbml0b3IpOwotCQllbHNlCi0JCQlzaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLm5ld01vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGJvb2xlYW4gc2VsZWN0ZWQsIGZpbmFsIEJvb2xlYW5Nb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dCh0eHQpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0eHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5CT1JERVIpOwotCQlpZiAodHh0ICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgY29tcCwgaW50IHYsIGZpbmFsIEludE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFNwaW5uZXIgcyA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIpOwotCQlzLnNldE1pbmltdW0oMCk7Ci0JCXMuc2V0TWF4aW11bShJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCWlmICh2ICE9IC0xKQotCQkJcy5zZXRTZWxlY3Rpb24odik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlzLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsJCi0JCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZChzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZVR5cGVDb21ibyhDb21wb3NpdGUgY29tcCwgZmluYWwgU3RyaW5nW10gdHlwZXMsIFN0cmluZyBzZWwsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJaW50IHNpemUgPSB0eXBlcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpdGVtc1tpXSA9IHR5cGVzW2ldOwotCQkJaWYgKHR5cGVzW2ldLmVxdWFscyhzZWwpKQotCQkJCWluZGV4ID0gaTsKLQkJfQotCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHR5cGVzW2NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJKChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5QUkVGX0RJQUxPRyk7Ci0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLmxvY2FsUG9ydCk7Ci0JCW1vbml0b3JQb3J0ID0gY3JlYXRlU3Bpbm5lcihjb21wb3NpdGUsIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCksIG5ldyBJbnRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSkgewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc2V0TG9jYWxQb3J0KGkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucmVtb3RlR3JvdXApOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLnJlbW90ZUhvc3QpOwotCQljcmVhdGVUZXh0KGdyb3VwLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbmV3IFN0cmluZ01vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKSB7Ci0JCQkJbW9uaXRvci5zZXRSZW1vdGVIb3N0KHMpOwotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLnJlbW90ZVBvcnQpOwotCQljcmVhdGVTcGlubmVyKGdyb3VwLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRSZW1vdGVQb3J0KGkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5wYXJzZVR5cGUpOwotCQljcmVhdGVUeXBlQ29tYm8oZ3JvdXAsIG5ldyBTdHJpbmdbXSB7IlRDUC9JUCIsIkhUVFAifSwgbW9uaXRvci5nZXRQcm90b2NvbCgpLCBuZXcgU3RyaW5nTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHByb3RvY29sSWQpIHsKLQkJCQltb25pdG9yLnNldFByb3RvY29sKHByb3RvY29sSWQpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5jb25uZWN0aW9uVGltZW91dCk7Ci0JCWNyZWF0ZVNwaW5uZXIoZ3JvdXAsIG1vbml0b3IuZ2V0VGltZW91dCgpLCBuZXcgSW50TW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpIHsKLQkJCQltb25pdG9yLnNldFRpbWVvdXQoaSk7Ci0JCQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljcmVhdGVMYWJlbChncm91cCwgIiIpOwotCQljcmVhdGVDaGVja0JveChncm91cCwgTWVzc2FnZXMuYXV0b1N0YXJ0LCBtb25pdG9yLmlzQXV0b1N0YXJ0KCksIG5ldyBCb29sZWFuTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBiKSB7Ci0JCQkJbW9uaXRvci5zZXRBdXRvU3RhcnQoYik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdmFsaWRhdGVMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCQl2YWxpZGF0ZUxhYmVsLnNldEZvcmVncm91bmQoY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlJTW9uaXRvciBzYXZlZE1vbml0b3IgPSBudWxsOwotCQl0cnkgewotCQkJc2F2ZWRNb25pdG9yID0gbW9uaXRvci5zYXZlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2F2ZWRNb25pdG9yICE9IG51bGwgJiYgc2F2ZWRNb25pdG9yLmlzQXV0b1N0YXJ0KCkpCi0JCQl0cnkgewotCQkJCXNhdmVkTW9uaXRvci5zdGFydCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBidXR0b25Db250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlRmllbGRzKCk7Ci0JCXJldHVybiBidXR0b25Db250cm9sOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPS0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBjdXJJc0VuYWJsZWQpIHsKLQkJaWYgKG9rQnV0dG9uID09IG51bGwpCi0JCQlva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJCi0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChjdXJJc0VuYWJsZWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmllbGRzKCkgewotCQlpZiAobW9uaXRvclBvcnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBtb25pdG9yLnZhbGlkYXRlKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJaWYgKG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpID09IG51bGwgfHwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCkubGVuZ3RoKCkgPCAxKQotCQkJCXZhbGlkYXRlTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQllbHNlCi0JCQkJdmFsaWRhdGVMYWJlbC5zZXRUZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0gZWxzZQotCQkJdmFsaWRhdGVMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCXNldE9LQnV0dG9uRW5hYmxlZChyZXN1bHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI3NDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBtb25pdG9yIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkaXNwbGF5QnV0dG9uOwotCQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBCdXR0b24gc3RhcnQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdG9wOwotCQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gc2VsZWN0aW9uMjsKLQotCS8qKgotCSAqIE1vbml0b3JQcmVmZXJlbmNlUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuUFJFRik7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWRpc3BsYXlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZGlzcGxheUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTaG93Vmlldyk7Ci0JCWRpc3BsYXlCdXR0b24uc2V0U2VsZWN0aW9uKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDg7Ci0JCWRpc3BsYXlCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaXNwbGF5QnV0dG9uLCBDb250ZXh0SWRzLlBSRUZfU0hPVyk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5tb25pdG9yTGlzdCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDM1MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgQ29udGV4dElkcy5QUkVGX01PTklUT1JTKTsKLQkJCi0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQotCQlUYWJsZUNvbHVtbiBzdGF0dXNDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uU3RhdHVzKTsKLQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNiwgNjAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gcmVtb3RlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXJlbW90ZUNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblJlbW90ZSk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQkJCi0JCVRhYmxlQ29sdW1uIGh0dHBDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJaHR0cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblR5cGUpOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNSwgNTAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gbG9jYWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJbG9jYWxDb2x1bW4uc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5Mb2NhbCk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2LCA2MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQlUYWJsZUNvbHVtbiBzdGFydE9uU3RhcnR1cENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlzdGFydE9uU3RhcnR1cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtbkF1dG9TdGFydCk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg3LCA3MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQotCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOwotCQkJCU9iamVjdCBtb25pdG9yID0gbW9uaXRvcnNbbW9uaXRvcnMubGVuZ3RoIC0gMV07Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vbml0b3IpKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBnZXRTZWxlY3Rpb24oKS5nZXQoMCk7Ci0JCQkJSU1vbml0b3JXb3JraW5nQ29weSB3YyA9IG1vbml0b3IuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHdjKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuZGVsZXRlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlKG1vbml0b3IpOwotCQkJCQkKLQkJCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCQkJCWlmIChtb25pdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlPYmplY3QgbW9uaXRvcjIgPSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXTsKLQkJCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb25pdG9yMikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJc3RhcnQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdGFydCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIHN0YXJ0LmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDk7Ci0JCXN0YXJ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgY2UuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2gobW9uaXRvciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXN0b3AgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdG9wKTsKLQkJc3RvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLnN0b3AoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKG1vbml0b3IsIHRydWUpOwotCQkJCX0KLQkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuCi0JICogdGhlIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlkaXNwbGF5QnV0dG9uLnNldFNlbGVjdGlvbihNb25pdG9yVUlQbHVnaW4uZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU1vbml0b3JVSVBsdWdpbi5zZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoZGlzcGxheUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJc2VsZWN0aW9uMiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTW9uaXRvcikKLQkJCQlzZWxlY3Rpb24yLmFkZChvYmopOwotCQl9Ci0JCQotCQlpZiAoIXNlbGVjdGlvbjIuaXNFbXB0eSgpKSB7Ci0JCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQkJYm9vbGVhbiBhbGxTdG9wcGVkID0gdHJ1ZTsKLQkJCWJvb2xlYW4gYWxsU3RhcnRlZCA9IHRydWU7Ci0JCQkKLQkJCWl0ZXJhdG9yID0gc2VsZWN0aW9uMi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKLQkJCQkJYWxsU3RvcHBlZCA9IGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJYWxsU3RhcnRlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQuc2V0RW5hYmxlZChhbGxTdG9wcGVkKTsKLQkJCXN0b3Auc2V0RW5hYmxlZChhbGxTdGFydGVkKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChzZWxlY3Rpb24yLnNpemUoKSA9PSAxICYmIGFsbFN0b3BwZWQpOwotCQl9IGVsc2UgewotCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3NTMyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIE1vbml0b3IgdGFibGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgZWxlbWVudDsKLQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19NT05JVE9SX09OKTsKLQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19NT05JVE9SX09GRik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJCXJldHVybiBNZXNzYWdlcy5zdGFydGVkOwotCQkJcmV0dXJuIE1lc3NhZ2VzLnN0b3BwZWQ7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKLQkJCXJldHVybiBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSArICI6IiArIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKQotCQkJcmV0dXJuIG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKLQkJCXJldHVybiBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiI7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDQpIHsKLQkJCWlmIChtb25pdG9yLmlzQXV0b1N0YXJ0KCkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnllczsKLQkJCXJldHVybiBNZXNzYWdlcy5ubzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIlgiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQkKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNjZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vbml0b3JWaWV3OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgVENQL0lQIG1vbml0b3IgVUkgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQlVGRkVSID0gbmV3IGJ5dGVbNDA5Nl07Ci0KLQlwcml2YXRlIHN0YXRpYyBNb25pdG9yVUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4gaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NMQ0wgPSAiY2xjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTENMID0gImVsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRExDTCA9ICJkbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09CSiA9ICJvYmoxNi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU09SVF9SRVNQT05TRV9USU1FID0gIklNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfQ0xFQVIgPSAiSU1HX0VMQ0xfQ0xFQVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0hUVFBfSEVBREVSID0gIklNR19FTENMX0hUVFBfSEVBREVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9QSU4gPSAiSU1HX0VMQ0xfUElOIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TT1JUX1JFU1BPTlNFX1RJTUUgPSAiSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9DTEVBUiA9ICJJTUdfQ0xDTF9DTEVBUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfSFRUUF9IRUFERVIgPSAiSU1HX0NMQ0xfSFRUUF9IRUFERVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1BJTiA9ICJJTUdfQ0xDTF9QSU4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NPUlRfUkVTUE9OU0VfVElNRSA9ICJJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0NMRUFSID0gIklNR19ETENMX0NMRUFSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9IVFRQX0hFQURFUiA9ICJJTUdfRExDTF9IVFRQX0hFQURFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfUElOID0gIklNR19ETENMX1BJTiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXF1ZXN0UmVzcG9uc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXNlbmRSZXF1ZXN0UmVzcG9uc2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0hPU1QgPSAiaG9zdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT04gPSAibW9uaXRvck9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTU9OSVRPUl9PRkYgPSAibW9uaXRvck9mZiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19WSUVXX09OX0FDVElWSVRZID0gInNob3ctdmlldyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTl9WSUVXID0gInBpbi12aWV3IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19IRUFERVIgPSAic2hvdy1oZWFkZXIiOwotCi0JcHJvdGVjdGVkIExpc3Q8UmVxdWVzdD4gcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVlc3Q+KCk7Ci0KLQlwcm90ZWN0ZWQgSU1vbml0b3JMaXN0ZW5lciBtb25pdG9yTGlzdGVuZXIgPSBuZXcgSU1vbml0b3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCW1vbml0b3IuYWRkUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb25pdG9yQ2hhbmdlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCW1vbml0b3IucmVtb3ZlUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElSZXF1ZXN0TGlzdGVuZXIgcmVxdWVzdExpc3RlbmVyID0gbmV3IElSZXF1ZXN0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlcXVlc3RBZGRlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCWFkZFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkKLQkJCWlmIChNb25pdG9yVmlldy52aWV3ICE9IG51bGwpCi0JCQkJTW9uaXRvclZpZXcudmlldy5kb1JlcXVlc3RBZGRlZChyZXF1ZXN0KTsKLQkJCWVsc2UgaWYgKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSkKLQkJCQlNb25pdG9yVmlldy5vcGVuKHJlcXVlc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVxdWVzdENoYW5nZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlpZiAoTW9uaXRvclZpZXcudmlldyAhPSBudWxsKQotCQkJCU1vbml0b3JWaWV3LnZpZXcuZG9SZXF1ZXN0Q2hhbmdlZChyZXF1ZXN0KTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBNb25pdG9yVUlQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHByZS1sb2FkcyB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEltYWdlUmVnaXN0cnkgY3JlYXRlSW1hZ2VSZWdpc3RyeSgpIHsKLQkJSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSA9IHN1cGVyLmNyZWF0ZUltYWdlUmVnaXN0cnkoKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19SRVFVRVNUX1JFU1BPTlNFLCBVUkxfT0JKICsgInRjcC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1JFU0VORF9SRVFVRVNUX1JFU1BPTlNFLCBVUkxfRUxDTCArICJyZXNlbmRSZXF1ZXN0LmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0hPU1QsIFVSTF9PQkogKyAiaG9zdC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX01PTklUT1JfT04sIFVSTF9PQkogKyAibW9uaXRvck9uLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTU9OSVRPUl9PRkYsIFVSTF9PQkogKyAibW9uaXRvck9mZi5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX0NMRUFSLCBVUkxfQ0xDTCArICJjbGVhci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FLCBVUkxfQ0xDTCArICJzb3J0UmVzcG9uc2VUaW1lLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9IVFRQX0hFQURFUiwgVVJMX0NMQ0wgKyAiaHR0cEhlYWRlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfUElOLCBVUkxfQ0xDTCArICJwaW4uZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9DTEVBUiwgVVJMX0VMQ0wgKyAiY2xlYXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSwgVVJMX0VMQ0wgKyAic29ydFJlc3BvbnNlVGltZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfSFRUUF9IRUFERVIsIFVSTF9FTENMICsgImh0dHBIZWFkZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX1BJTiwgVVJMX0VMQ0wgKyAicGluLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfQ0xFQVIsIFVSTF9ETENMICsgImNsZWFyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUsIFVSTF9ETENMICsgInNvcnRSZXNwb25zZVRpbWUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX0hUVFBfSEVBREVSLCBVUkxfRExDTCArICJodHRwSGVhZGVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9QSU4sIFVSTF9ETENMICsgInBpbi5naWYiKTsKLQkJCi0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCWdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkJcmV0dXJuIGdldEluc3RhbmNlKCkuaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9uaXRvclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KE1vbml0b3JVSVBsdWdpbi5TSE9XX1ZJRVdfT05fQUNUSVZJVFksIHRydWUpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KE1vbml0b3JVSVBsdWdpbi5QSU5fVklFVywgZmFsc2UpOwotCQkKLQkJTW9uaXRvckNvcmUuYWRkTW9uaXRvckxpc3RlbmVyKG1vbml0b3JMaXN0ZW5lcik7Ci0JCQotCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSU1vbml0b3IgbW9uaXRvciA6IG1vbml0b3JzKQotCQkJCW1vbml0b3IuYWRkUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSU1vbml0b3IgbW9uaXRvciA6IG1vbml0b3JzKQotCQkJCW1vbml0b3IucmVtb3ZlUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCU1vbml0b3JDb3JlLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihtb25pdG9yTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihTSE9XX1ZJRVdfT05fQUNUSVZJVFkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oU0hPV19WSUVXX09OX0FDVElWSVRZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKGJvb2xlYW4gYikgewotCQlnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFNIT1dfVklFV19PTl9BQ1RJVklUWSwgYik7Ci0JCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFBpblZpZXdQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFBJTl9WSUVXKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGluVmlld1ByZWZlcmVuY2UoYm9vbGVhbiBiKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUElOX1ZJRVcsIGIpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93SGVhZGVyUHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihTSE9XX0hFQURFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGJvb2xlYW4gYikgewotCQlnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFNIT1dfSEVBREVSLCBiKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdW56aXAgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIGd6aXAuIFRoZSByZXR1cm5lZCBieXRlCi0JICogYXJyYXkgaXMgZWl0aGVyIHRoZSB1bnppcHBlZCByZXN1bHRzLCBvciB0aGUgb3JpZ2luYWwgYnl0ZSBhcnJheSBpZiB1bnppcHBpbmcKLQkgKiB3YXMgbm90IHN1Y2Nlc3NmdWwuIFRoZSBieXRlIGFycmF5IG11c3Qgbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIGIgYSBieXRlIGFycmF5Ci0JICogQHJldHVybiB0aGUgdW56aXBwZWQgYXJyYXksIG9yIHRoZSBvcmlnaW5hbCBhcnJheSBpZiB1bnN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBieXRlW10gdW56aXAoYnl0ZVtdIGIpIHsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCXRyeSB7Ci0JCQlHWklQSW5wdXRTdHJlYW0gZ2luID0gbmV3IEdaSVBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotCQkJYnl0ZVtdIHQgPSBuZXcgYnl0ZVswXTsKLQkJCXdoaWxlIChnaW4uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJaW50IG4gPSBnaW4ucmVhZChCVUZGRVIpOwotCQkJCWlmIChuID4gMCkgewotCQkJCQlieXRlW10gdGVtcCA9IG5ldyBieXRlW3QubGVuZ3RoICsgbl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodCwgMCwgdGVtcCwgMCwgdC5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KEJVRkZFUiwgMCwgdGVtcCwgdC5sZW5ndGgsIG4pOwotCQkJCQl0ID0gdGVtcDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNvdWxkIG5vdCB1bnppcCBieXRlIGFycmF5Iik7Ci0JCQlyZXR1cm4gYjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwYXJzZSB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBTdHJpbmcgZm9ybS4gVGhlIGJ5dGVzCi0JICogYXJlIHBhcnNlZCBpbnRvIGEgbGluZSBkZWxpbWl0ZWQgc3RyaW5nLiBUaGUgYnl0ZSBhcnJheSBtdXN0IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBiIGEgYnl0ZSBhcnJheQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBhZnRlciB0aGUgY29udmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiaW4pKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOwotCQkJCi0JCQl3aGlsZSAocyAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKHMpOwotCQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJCWlmIChzICE9IG51bGwpCi0JCQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHBhcnNpbmcgaW5wdXQiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKCFyZXF1ZXN0cy5jb250YWlucyhyZXF1ZXN0KSkKLQkJCXJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgewotCQlSZXF1ZXN0W10gciA9IG5ldyBSZXF1ZXN0W3JlcXVlc3RzLnNpemUoKV07Ci0JCXJlcXVlc3RzLnRvQXJyYXkocik7Ci0JCXJldHVybiByOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhclJlcXVlc3RzKCkgewotCQlyZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTkyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBbiBhY3Rpb24gZmlsdGVyIGZvciByZXF1ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU0VOVCA9ICJyZXF1ZXN0c2VudCI7Ci0KLQkvKioKLQkgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgdGFyZ2V0OwotCQlpZiAobmFtZS5lcXVhbHMoUkVRVUVTVF9TRU5UKSkgewotCQkJaWYgKHZhbHVlLmVxdWFscygidHJ1ZSIpKQotCQkJCXJldHVybiByZXF1ZXN0LmdldFJlc3BvbnNlVGltZSgpICE9IC0xOwotCQkJCi0JCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjN2Q2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgUmVxdWVzdHMgdG8gSUFjdGlvbkZpbHRlci4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBSZXF1ZXN0QWN0aW9uRmlsdGVyIHJlcUFjdGlvbkZpbHRlciA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcykgewotCQkJaWYgKHJlcUFjdGlvbkZpbHRlciA9PSBudWxsKSB7Ci0JCQkJcmVxQWN0aW9uRmlsdGVyID0gbmV3IFJlcXVlc3RBY3Rpb25GaWx0ZXIoKTsKLQkJCX0KLQkJCXJldHVybiByZXFBY3Rpb25GaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElBY3Rpb25GaWx0ZXIuY2xhc3MgfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYyMmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgYm9vbGVhbiBpc1NlbGVjdGVkKXsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodHh0KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihpc1NlbGVjdGVkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodHh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdlMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLS8qKgotICogU3RhcnR1cCBob29rLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklTdGFydHVwI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBwbHVnaW4gbG9hZGluZyBpcyBlbm91Z2gKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YWMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJdHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQotCQlpZiAoIU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL01vbml0b3JTdGFja0xheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL01vbml0b3JTdGFja0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiMTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9Nb25pdG9yU3RhY2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLS8qKgotICogVGhpcyBMYXlvdXQgc3RhY2tzIGFsbCB0aGUgY29udHJvbHMgb25lIG9uIHRvcCBvZiB0aGUgb3RoZXIgYW5kIHJlc2l6ZXMgYWxsIGNvbnRyb2xzCi0gKiB0byBoYXZlIHRoZSBzYW1lIHNpemUgYW5kIGxvY2F0aW9uLgotICogVGhlIGNvbnRyb2wgc3BlY2lmaWVkIGluIHRvcENvbnRyb2wgaXMgdmlzaWJsZSBhbmQgYWxsIG90aGVyIGNvbnRyb2xzIGFyZSBub3QgdmlzaWJsZS4KLSAqIFVzZXJzIG11c3Qgc2V0IHRoZSB0b3BDb250cm9sIHZhbHVlIHRvIGZsaXAgYmV0d2VlbiB0aGUgdmlzaWJsZSBpdGVtcyBhbmQgdGhlbiBjYWxsIAotICogbGF5b3V0KCkgb24gdGhlIGNvbXBvc2l0ZSB3aGljaCBoYXMgdGhlIE1vbml0b3JTdGFja0xheW91dC4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JTdGFja0xheW91dCBleHRlbmRzIExheW91dCB7Ci0gCS8qKgotIAkgKiB0b3BDb250cm9sIHRoZSBDb250cm9sIHRoYXQgaXMgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotIAkgKiBBbGwgb3RoZXIgY29udHJvbHMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIHBhcmVudCBjb21wb3NpdGUgd2lsbCBub3QgYmUgdmlzaWJsZS4KLSAJICovCi0gCXB1YmxpYyBDb250cm9sIHRvcENvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlDb250cm9sIGNoaWxkcmVuW10gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IG1heFdpZHRoID0gMDsKLQkJaW50IG1heEhlaWdodCA9IDA7Ci0JCWZvciAoQ29udHJvbCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdG9wQ29udHJvbCkgewotCQkJCVBvaW50IHNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCW1heFdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCBtYXhXaWR0aCk7Ci0JCQkJbWF4SGVpZ2h0ID0gTWF0aC5tYXgoc2l6ZS55LCBtYXhIZWlnaHQpOwotCQkJfQotCQl9Ci0JCWludCB3aWR0aCA9IG1heFdpZHRoOwotCQlpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0OwotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQl3aWR0aCA9IHdIaW50OwotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQloZWlnaHQgPSBoSGludDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaENhY2hlKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCUNvbnRyb2wgY2hpbGRyZW5bXSA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCWZvciAoQ29udHJvbCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShyZWN0LngrMiwgcmVjdC55LCByZWN0LndpZHRoLTIsIHJlY3QuaGVpZ2h0KTsKLQkJCQljaGlsZC5zZXRCb3VuZHMocik7Ci0JCQl9IGVsc2UKLQkJCQljaGlsZC5zZXRCb3VuZHMocmVjdCk7Ci0JCQljaGlsZC5zZXRWaXNpYmxlKGNoaWxkID09IHRvcENvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb25pdG9yU3RhY2tMYXlvdXQiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ1MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotLyoqCi0gKiBUaGUgU2FzaEZvcm0gaXMgYSBjb21wb3NpdGUgY29udHJvbCB0aGF0IGxheXMgb3V0IGl0cyBjaGlsZHJlbiBpbiBhCi0gKiByb3cgb3IgY29sdW1uIGFycmFuZ2VtZW50IChhcyBzcGVjaWZpZWQgYnkgdGhlIG9yaWVudGF0aW9uKSBhbmQgcGxhY2VzCi0gKiBhIFNhc2ggYmV0d2VlbiBlYWNoIGNoaWxkLiBPbmUgY2hpbGQgbWF5IGJlIG1heGltaXplZCB0byBvY2N1cHkgdGhlCi0gKiBlbnRpcmUgc2l6ZSBvZiB0aGUgU2FzaEZvcm0uICBUaGUgcmVsYXRpdmUgc2l6ZXMgb2YgdGhlIGNoaWxkcmVuIG1heQotICogYmUgc3BlY2lmaWVkIHVzaW5nIHdlaWdodHMuCi0gKiA8cD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPjwvZHQ+Ci0gKiA8ZGQ+SE9SSVpPTlRBTCwgVkVSVElDQUwsIFNNT09USDwvZGQ+Ci0gKiA8L2RsPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU2FzaEZvcm0gZXh0ZW5kcyBDb21wb3NpdGUgewotCXB1YmxpYyBpbnQgU0FTSF9XSURUSCA9IDM7Ci0KLQlpbnQgc2FzaFN0eWxlOwotCVNhc2hbXSBzYXNoZXMgPSBuZXcgU2FzaFswXTsKLQkvLyBSZW1lbWJlciBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kCi0JLy8gY29sb3JzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNldAotCS8vIHNhc2hlcyB0byB0aGUgZGVmYXVsdCBjb2xvciAobnVsbCkgb3IKLQkvLyBhIHNwZWNpZmljIGNvbG9yCi0JQ29sb3IgYmFja2dyb3VuZCA9IG51bGw7Ci0JQ29sb3IgZm9yZWdyb3VuZCA9IG51bGw7Ci0JQ29udHJvbFtdIGNvbnRyb2xzID0gbmV3IENvbnRyb2xbMF07Ci0JQ29udHJvbCBtYXhDb250cm9sID0gbnVsbDsKLQlMaXN0ZW5lciBzYXNoTGlzdGVuZXI7Ci0Jc3RhdGljIGZpbmFsIGludCBEUkFHX01JTklNVU0gPSAyMDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZVNhc2ggPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNpemU7ICAKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTV1QjSE9SSVpPTlRBTAotICogQHNlZSBTV1QjVkVSVElDQUwKLSAqIEBzZWUgI2dldFN0eWxlKCkKLSAqLwotcHVibGljIFNhc2hGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCXN1cGVyKHBhcmVudCwgY2hlY2tTdHlsZTIoc3R5bGUpKTsKLQlzdXBlci5zZXRMYXlvdXQobmV3IFNhc2hGb3JtTGF5b3V0KCkpOwotCXNhc2hTdHlsZSA9ICgoc3R5bGUgJiBTV1QuVkVSVElDQUwpICE9IDApID8gU1dULkhPUklaT05UQUwgOiBTV1QuVkVSVElDQUw7Ci0JaWYgKChzdHlsZSAmIFNXVC5CT1JERVIpICE9IDApIHNhc2hTdHlsZSB8PSBTV1QuQk9SREVSOwotCWlmICgoc3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzYXNoU3R5bGUgfD0gU1dULlNNT09USDsKLQlzYXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCW9uRHJhZ1Nhc2goZSk7Ci0JCX0KLQl9OwotfQotc3RhdGljIGludCBjaGVja1N0eWxlMihpbnQgc3R5bGUpIHsKLQlpbnQgbWFzayA9IFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5SSUdIVF9UT19MRUZUOwotCXJldHVybiBzdHlsZSAmIG1hc2s7Ci19Ci0vKioKLSAqIFJldHVybnMgU1dULkhPUklaT05UQUwgaWYgdGhlIGNvbnRyb2xzIGluIHRoZSBTYXNoRm9ybSBhcmUgbGFpZCBvdXQgc2lkZSBieSBzaWRlCi0gKiBvciBTV1QuVkVSVElDQUwgICBpZiB0aGUgY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIGFyZSBsYWlkIG91dCB0b3AgdG8gYm90dG9tLgotICogCi0gKiBAcmV0dXJuIFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAotICovCi1wdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCS8vY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gKHNhc2hTdHlsZSAmIFNXVC5WRVJUSUNBTCkgIT0gMCA/IFNXVC5IT1JJWk9OVEFMIDogU1dULlZFUlRJQ0FMOwotfQotcHVibGljIGludCBnZXRTdHlsZSgpIHsKLQlpbnQgc3R5bGUgPSBzdXBlci5nZXRTdHlsZSgpOwotCXN0eWxlIHw9IGdldE9yaWVudGF0aW9uKCkgPT0gU1dULlZFUlRJQ0FMID8gU1dULlZFUlRJQ0FMIDogU1dULkhPUklaT05UQUw7Ci0JaWYgKChzYXNoU3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCXJldHVybiBzdHlsZTsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBjb250cm9sIHRoYXQgY3VycmVudGx5IGlzIG1heGltaXplZCBpbiB0aGUgU2FzaEZvcm0uICAKLSAqIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwuCi0gKiAKLSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCBjdXJyZW50bHkgaXMgbWF4aW1pemVkIG9yIG51bGwKLSAqLwotcHVibGljIENvbnRyb2wgZ2V0TWF4aW1pemVkQ29udHJvbCgpewotCS8vY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gdGhpcy5tYXhDb250cm9sOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoIGNoaWxkIGluIHRoZSBTYXNoRm9ybS4gIFRoZSB3ZWlnaHQgcmVwcmVzZW50cyB0aGUKLSAqIHBlcmNlbnQgb2YgdGhlIHRvdGFsIHdpZHRoIChpZiBTYXNoRm9ybSBoYXMgSG9yaXpvbnRhbCBvcmllbnRhdGlvbikgb3IgCi0gKiB0b3RhbCBoZWlnaHQgKGlmIFNhc2hGb3JtIGhhcyBWZXJ0aWNhbCBvcmllbnRhdGlvbikgZWFjaCBjb250cm9sIG9jY3VwaWVzLgotICogVGhlIHdlaWdodHMgYXJlIHJldHVybmVkIGluIG9yZGVyIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2lkZ2V0cyAod2VpZ2h0WzBdCi0gKiBjb3JyZXNwb25kcyB0byB0aGUgd2VpZ2h0IG9mIHRoZSBmaXJzdCBjaGlsZCBjcmVhdGVkKS4KLSAqIAotICogQHJldHVybiB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi0KLXB1YmxpYyBpbnRbXSBnZXRXZWlnaHRzKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKLQlpbnRbXSByYXRpb3MgPSBuZXcgaW50W2NBcnJheS5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCU9iamVjdCBkYXRhID0gY0FycmF5W2ldLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7Ci0JCQlyYXRpb3NbaV0gPSAoaW50KSgoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgKiAxMDAwID4+IDE2KTsKLQkJfSBlbHNlIHsKLQkJCXJhdGlvc1tpXSA9IDIwMDsKLQkJfQotCX0KLQlyZXR1cm4gcmF0aW9zOwotfQotQ29udHJvbFtdIGdldENvbnRyb2xzKGJvb2xlYW4gb25seVZpc2libGUpIHsKLQlDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCUNvbnRyb2xbXSByZXN1bHQgPSBuZXcgQ29udHJvbFswXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFNhc2gpIGNvbnRpbnVlOwotCQlpZiAob25seVZpc2libGUgJiYgIWNoaWxkcmVuW2ldLmdldFZpc2libGUoKSkgY29udGludWU7Ci0KLQkJQ29udHJvbFtdIG5ld1Jlc3VsdCA9IG5ldyBDb250cm9sW3Jlc3VsdC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5ld1Jlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JCW5ld1Jlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGNoaWxkcmVuW2ldOwotCQlyZXN1bHQgPSBuZXdSZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci12b2lkIG9uRHJhZ1Nhc2goRXZlbnQgZXZlbnQpIHsKLQlpZiAoIWVuYWJsZVNhc2gpCi0JCXJldHVybjsKLQkKLQlTYXNoIHNhc2ggPSAoU2FzaClldmVudC53aWRnZXQ7Ci0JaW50IHNhc2hJbmRleCA9IC0xOwotCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHNhc2hlc1tpXSA9PSBzYXNoKSB7Ci0JCQlzYXNoSW5kZXggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHNhc2hJbmRleCA9PSAtMSkgcmV0dXJuOwotCQotCUNvbnRyb2wgYzEgPSBjb250cm9sc1tzYXNoSW5kZXhdOwotCUNvbnRyb2wgYzIgPSBjb250cm9sc1tzYXNoSW5kZXggKyAxXTsKLQlSZWN0YW5nbGUgYjEgPSBjMS5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgYjIgPSBjMi5nZXRCb3VuZHMoKTsKLQkKLQlSZWN0YW5nbGUgc2FzaEJvdW5kcyA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JUmVjdGFuZ2xlIGFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JYm9vbGVhbiBjb3JyZWN0aW9uID0gZmFsc2U7Ci0JaWYgKGdldE9yaWVudGF0aW9uKCkgPT0gU1dULkhPUklaT05UQUwpIHsKLQkJY29ycmVjdGlvbiA9IGIxLndpZHRoIDwgRFJBR19NSU5JTVVNIHx8IGIyLndpZHRoIDwgRFJBR19NSU5JTVVNOwotCQlpbnQgdG90YWxXaWR0aCA9IGIyLnggKyBiMi53aWR0aCAtIGIxLng7IAotCQlpbnQgc2hpZnQgPSBldmVudC54IC0gc2FzaEJvdW5kcy54OwotCQliMS53aWR0aCArPSBzaGlmdDsKLQkJYjIueCArPSBzaGlmdDsKLQkJYjIud2lkdGggLT0gc2hpZnQ7Ci0JCWlmIChiMS53aWR0aCA8IERSQUdfTUlOSU1VTSkgewotCQkJYjEud2lkdGggPSBEUkFHX01JTklNVU07Ci0JCQliMi54ID0gYjEueCArIGIxLndpZHRoICsgc2FzaEJvdW5kcy53aWR0aDsKLQkJCWIyLndpZHRoID0gdG90YWxXaWR0aCAtIGIyLng7Ci0JCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCWlmIChiMi53aWR0aCA8IERSQUdfTUlOSU1VTSkgewotCQkJYjEud2lkdGggPSB0b3RhbFdpZHRoIC0gRFJBR19NSU5JTVVNIC0gc2FzaEJvdW5kcy53aWR0aDsKLQkJCWIyLnggPSBiMS54ICsgYjEud2lkdGggKyBzYXNoQm91bmRzLndpZHRoOwotCQkJYjIud2lkdGggPSBEUkFHX01JTklNVU07Ci0JCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCX0KLQkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQkJfQotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMSkud2VpZ2h0ID0gKCgobG9uZyliMS53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOwotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgobG9uZyliMi53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOwotCX0gZWxzZSB7Ci0JCWNvcnJlY3Rpb24gPSBiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0gfHwgYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNOwotCQlpbnQgdG90YWxIZWlnaHQgPSBiMi55ICsgYjIuaGVpZ2h0IC0gYjEueTsKLQkJaW50IHNoaWZ0ID0gZXZlbnQueSAtIHNhc2hCb3VuZHMueTsKLQkJYjEuaGVpZ2h0ICs9IHNoaWZ0OwotCQliMi55ICs9IHNoaWZ0OwotCQliMi5oZWlnaHQgLT0gc2hpZnQ7Ci0JCWlmIChiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0pIHsKLQkJCWIxLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKLQkJCWIyLnkgPSBiMS55ICsgYjEuaGVpZ2h0ICsgc2FzaEJvdW5kcy5oZWlnaHQ7Ci0JCQliMi5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIGIyLnk7Ci0JCQlldmVudC55ID0gYjEueSArIGIxLmhlaWdodDsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCQlpZiAoYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNKSB7Ci0JCQliMS5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIERSQUdfTUlOSU1VTSAtIHNhc2hCb3VuZHMuaGVpZ2h0OwotCQkJYjIueSA9IGIxLnkgKyBiMS5oZWlnaHQgKyBzYXNoQm91bmRzLmhlaWdodDsKLQkJCWIyLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKLQkJCWV2ZW50LnkgPSBiMS55ICsgYjEuaGVpZ2h0OwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCX0KLQkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQkJfQotCQkvLygoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKChsb25nKWIxLmhlaWdodCA8PCAxNikgKyBhcmVhLmhlaWdodCAtIDEpIC8gYXJlYS5oZWlnaHQ7Ci0JCS8vKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoKGxvbmcpYjIuaGVpZ2h0IDw8IDE2KSArIGFyZWEuaGVpZ2h0IC0gMSkgLyBhcmVhLmhlaWdodDsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwICogYjEuaGVpZ2h0IC8gYjIuaGVpZ2h0OwotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgyMDAgPDwgMTYpICsgOTk5KSAvIDEwMDA7Ci0JfQotCWlmIChjb3JyZWN0aW9uIHx8IChldmVudC5kb2l0ICYmIGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykpIHsKLQkJYzEuc2V0Qm91bmRzKGIxKTsKLQkJc2FzaC5zZXRCb3VuZHMoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCWMyLnNldEJvdW5kcyhiMik7Ci0JfQotfQotLyoqCi0gKiBJZiBvcmllbnRhdGlvbiBpcyBTV1QuSE9SSVpPTlRBTCwgbGF5IHRoZSBjb250cm9scyBpbiB0aGUgU2FzaEZvcm0gCi0gKiBvdXQgc2lkZSBieSBzaWRlLiAgSWYgb3JpZW50YXRpb24gaXMgU1dULlZFUlRJQ0FMLCBsYXkgdGhlIAotICogY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIG91dCB0b3AgdG8gYm90dG9tLgotICogCi0gKiBAcGFyYW0gb3JpZW50YXRpb24gU1dULkhPUklaT05UQUwgb3IgU1dULlZFUlRJQ0FMCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgdmFsdWUgb2Ygb3JpZW50YXRpb24gaXMgbm90IFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoZ2V0T3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikgcmV0dXJuOwotCWlmIChvcmllbnRhdGlvbiAhPSBTV1QuSE9SSVpPTlRBTCAmJiBvcmllbnRhdGlvbiAhPSBTV1QuVkVSVElDQUwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0Jc2FzaFN0eWxlICY9IH4oU1dULkhPUklaT05UQUwgfCBTV1QuVkVSVElDQUwpOwotCXNhc2hTdHlsZSB8PSBvcmllbnRhdGlvbiA9PSBTV1QuVkVSVElDQUwgPyBTV1QuSE9SSVpPTlRBTCA6IFNXVC5WRVJUSUNBTDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hlcy5sZW5ndGg7IGkrKykgewotCQlzYXNoZXNbaV0uZGlzcG9zZSgpOwotCQlzYXNoZXNbaV0gPSBuZXcgU2FzaCh0aGlzLCBzYXNoU3R5bGUpOwotCQlzYXNoZXNbaV0uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCXNhc2hlc1tpXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzYXNoTGlzdGVuZXIpOwotCX0KLQlsYXlvdXQoZmFsc2UpOwotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQliYWNrZ3JvdW5kID0gY29sb3I7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJc2FzaGVzW2ldLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JfQotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQlzdXBlci5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlmb3JlZ3JvdW5kID0gY29sb3I7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JfQotfQotLyoqCi0gKiBTZXRzIHRoZSBsYXlvdXQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciB0byBiZQotICogdGhlIGFyZ3VtZW50IHdoaWNoIG1heSBiZSBudWxsLgotICogPHA+Ci0gKiBOb3RlOiBObyBMYXlvdXQgY2FuIGJlIHNldCBvbiB0aGlzIENvbnRyb2wgYmVjYXVzZSBpdCBhbHJlYWR5Ci0gKiBtYW5hZ2VzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiBpdHMgY2hpbGRyZW4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGxheW91dCB0aGUgcmVjZWl2ZXIncyBuZXcgbGF5b3V0IG9yIG51bGwKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuOwotfQotLyoqCi0gKiBTcGVjaWZ5IHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIHRha2UgdXAgdGhlIGVudGlyZSBjbGllbnQgYXJlYSBvZiB0aGUgU2FzaEZvcm0uICAKLSAqIElmIG9uZSBjb250cm9sIGhhcyBiZWVuIG1heGltaXplZCwgYW5kIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wsIAotICogdGhlIHByZXZpb3VzIGNvbnRyb2wgd2lsbCBiZSBtaW5pbWl6ZWQgYW5kIHRoZSBuZXcgY29udHJvbCB3aWxsIGJlIG1heGltaXplZC4KLSAqIElmIHRoZSB2YWx1ZSBvZiBjb250cm9sIGlzIG51bGwsIHRoZSBTYXNoRm9ybSB3aWxsIG1pbmltaXplIGFsbCBjb250cm9scyBhbmQgcmV0dXJuIHRvCi0gKiB0aGUgZGVmYXVsdCBsYXlvdXQgd2hlcmUgYWxsIGNvbnRyb2xzIGFyZSBsYWlkIG91dCBzZXBhcmF0ZWQgYnkgc2FzaGVzLgotICogCi0gKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbCB0byBiZSBtYXhpbWl6ZWQgb3IgbnVsbAotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldE1heGltaXplZENvbnRyb2woQ29udHJvbCBjb250cm9sKXsKLQljaGVja1dpZGdldCgpOwotCWlmIChjb250cm9sID09IG51bGwpIHsKLQkJaWYgKG1heENvbnRyb2wgIT0gbnVsbCkgewotCQkJdGhpcy5tYXhDb250cm9sID0gbnVsbDsKLQkJCWxheW91dChmYWxzZSk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKXsKLQkJCQlzYXNoZXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCQotCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspewotCQlzYXNoZXNbaV0uc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCW1heENvbnRyb2wgPSBjb250cm9sOwotCWxheW91dChmYWxzZSk7Ci19Ci0KLS8qKgotICogU3BlY2lmeSB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQgaW4gdGhlIFNhc2hGb3JtLiAgVGhpcyB3aWxsIGRldGVybWluZQotICogd2hhdCBwZXJjZW50IG9mIHRoZSB0b3RhbCB3aWR0aCAoaWYgU2FzaEZvcm0gaGFzIEhvcml6b250YWwgb3JpZW50YXRpb24pIG9yIAotICogdG90YWwgaGVpZ2h0IChpZiBTYXNoRm9ybSBoYXMgVmVydGljYWwgb3JpZW50YXRpb24pIGVhY2ggY29udHJvbCB3aWxsIG9jY3VweS4KLSAqIFRoZSB3ZWlnaHRzIG11c3QgYmUgcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGVudHJ5IGZvciBlYWNoCi0gKiBub24tc2FzaCBjaGlsZCBvZiB0aGUgU2FzaEZvcm0uCi0gKiAKLSAqIEBwYXJhbSB3ZWlnaHRzIHRoZSByZWxhdGl2ZSB3ZWlnaHQgb2YgZWFjaCBjaGlsZAotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdlaWdodHMgdmFsdWUgaXMgbnVsbCBvciBvZiBpbmNvcnJlY3QgbGVuZ3RoIChtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFdlaWdodHMoaW50W10gd2VpZ2h0cykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKLQlpZiAod2VpZ2h0cyA9PSBudWxsIHx8IHdlaWdodHMubGVuZ3RoICE9IGNBcnJheS5sZW5ndGgpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JCi0JaWYgKHdlaWdodHMgPT0gbnVsbCkKLQkJcmV0dXJuOwotCQotCWludCB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmICh3ZWlnaHRzW2ldIDwgMCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQkJfQotCQl0b3RhbCArPSB3ZWlnaHRzW2ldOwotCX0KLQlpZiAodG90YWwgPT0gMCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNBcnJheS5sZW5ndGg7IGkrKykgewotCQlPYmplY3QgZGF0YSA9IGNBcnJheVtpXS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgIShkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWNBcnJheVtpXS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9ICgoKGxvbmcpd2VpZ2h0c1tpXSA8PCAxNikgKyB0b3RhbCAtIDEpIC8gdG90YWw7Ci0JfQotCi0JbGF5b3V0KGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2ltcGxlTGF5b3V0KGJvb2xlYW4gYikgewotCUNvbnRyb2xbXSBjQXJyYXkgPSBnZXRDb250cm9scyhmYWxzZSk7Ci0JaWYgKGNBcnJheSA9PSBudWxsIHx8IGNBcnJheS5sZW5ndGggIT0gMikKLQkJcmV0dXJuOwotCWVuYWJsZVNhc2ggPSBiOwotCVNhc2hGb3JtTGF5b3V0IGxheW91dCA9IChTYXNoRm9ybUxheW91dCkgZ2V0TGF5b3V0KCk7Ci0JbGF5b3V0LnNpbXBsZSA9ICFlbmFibGVTYXNoOwotCQotCWlmIChlbmFibGVTYXNoKQotCQlyZXNpemUgPSB0cnVlOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiYTIzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1jbGFzcyBTYXNoRm9ybURhdGEgewotCi0JbG9uZyB3ZWlnaHQ7Ci0KLVN0cmluZyBnZXROYW1lICgpIHsKLQlTdHJpbmcgc3RyaW5nID0gZ2V0Q2xhc3MgKCkuZ2V0TmFtZSAoKTsKLQlpbnQgaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YgKCcuJyk7Ci0JaWYgKGluZGV4ID09IC0xKSByZXR1cm4gc3RyaW5nOwotCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nIChpbmRleCArIDEsIHN0cmluZy5sZW5ndGggKCkpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlCi0gKiBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXZlbnQKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7Ci0JcmV0dXJuIGdldE5hbWUoKSsiIHt3ZWlnaHQ9Iit3ZWlnaHQrIn0iOyAvLyROT04tTkxTLTIkCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1MYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUwMzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGxheW91dCBmb3IgU2FzaEZvcm0KLSAqIAotICogQHNlZSBTYXNoRm9ybQotICovCi1jbGFzcyBTYXNoRm9ybUxheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2ltcGxlOwotCi1wcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCVNhc2hGb3JtIHNhc2hGb3JtID0gKFNhc2hGb3JtKWNvbXBvc2l0ZTsKLQlDb250cm9sW10gY0FycmF5ID0gc2FzaEZvcm0uZ2V0Q29udHJvbHModHJ1ZSk7Ci0JaW50IHdpZHRoID0gMDsKLQlpbnQgaGVpZ2h0ID0gMDsKLQlpZiAoY0FycmF5Lmxlbmd0aCA9PSAwKSB7Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JLy8gZGV0ZXJtaW5lIGNvbnRyb2wgc2l6ZXMKLQlib29sZWFuIHZlcnRpY2FsID0gc2FzaEZvcm0uZ2V0T3JpZW50YXRpb24oKSA9PSBTV1QuVkVSVElDQUw7Ci0JaW50IG1heEluZGV4ID0gMDsKLQlpbnQgbWF4VmFsdWUgPSAwOwotCVBvaW50W10gc2l6ZXMgPSBuZXcgUG9pbnRbY0FycmF5Lmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQlzaXplc1tpXSA9IGNBcnJheVtpXS5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotCQkJaWYgKHNpemVzW2ldLnkgPiBtYXhWYWx1ZSkgewotCQkJCW1heEluZGV4ID0gaTsKLQkJCQltYXhWYWx1ZSA9IHNpemVzW2ldLnk7Ci0JCQl9Ci0JCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBzaXplc1tpXS54KTsKLQkJfSBlbHNlIHsKLQkJCXNpemVzW2ldID0gY0FycmF5W2ldLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlpZiAoc2l6ZXNbaV0ueCA+IG1heFZhbHVlKSB7Ci0JCQkJbWF4SW5kZXggPSBpOwotCQkJCW1heFZhbHVlID0gc2l6ZXNbaV0ueDsKLQkJCX0KLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgc2l6ZXNbaV0ueSk7Ci0JCX0KLQl9Ci0JLy8gZ2V0IHRoZSByYXRpb3MKLQlsb25nW10gcmF0aW9zID0gbmV3IGxvbmdbY0FycmF5Lmxlbmd0aF07Ci0JbG9uZyB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJT2JqZWN0IGRhdGEgPSBjQXJyYXlbaV0uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpIHsKLQkJCXJhdGlvc1tpXSA9ICgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljQXJyYXlbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9IHJhdGlvc1tpXSA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCQkJCi0JCX0KLQkJdG90YWwgKz0gcmF0aW9zW2ldOwotCX0KLQlpZiAocmF0aW9zW21heEluZGV4XSA+IDApIHsKLQkJaW50IHNhc2h3aWR0aCA9IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPiAwID8gc2FzaEZvcm0uU0FTSF9XSURUSCArIHNhc2hGb3JtLnNhc2hlcyBbMF0uZ2V0Qm9yZGVyV2lkdGgoKSAqIDIgOiBzYXNoRm9ybS5TQVNIX1dJRFRIOwotCQlpZiAodmVydGljYWwpIHsKLQkJCWhlaWdodCArPSAoaW50KSh0b3RhbCAqIG1heFZhbHVlIC8gcmF0aW9zW21heEluZGV4XSkgKyAoY0FycmF5Lmxlbmd0aCAtIDEpICogc2FzaHdpZHRoOwotCQl9IGVsc2UgewotCQkJd2lkdGggKz0gKGludCkodG90YWwgKiBtYXhWYWx1ZSAvIHJhdGlvc1ttYXhJbmRleF0pICsgKGNBcnJheS5sZW5ndGggLSAxKSAqIHNhc2h3aWR0aDsKLQkJfQotCX0KLQl3aWR0aCArPSBzYXNoRm9ybS5nZXRCb3JkZXJXaWR0aCgpKjI7Ci0JaGVpZ2h0ICs9IHNhc2hGb3JtLmdldEJvcmRlcldpZHRoKCkqMjsKLQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0JaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsKLQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaENhY2hlKENvbnRyb2wgY29udHJvbCkgewotCXJldHVybiB0cnVlOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JU2FzaEZvcm0gc2FzaEZvcm0gPSAoU2FzaEZvcm0pY29tcG9zaXRlOwotCVJlY3RhbmdsZSBhcmVhID0gc2FzaEZvcm0uZ2V0Q2xpZW50QXJlYSgpOwotCWlmIChhcmVhLndpZHRoIDw9IDEgfHwgYXJlYS5oZWlnaHQgPD0gMSkgcmV0dXJuOwotCQotCUNvbnRyb2xbXSBuZXdDb250cm9scyA9IHNhc2hGb3JtLmdldENvbnRyb2xzKHRydWUpOwotCWlmIChzYXNoRm9ybS5jb250cm9scy5sZW5ndGggPT0gMCAmJiBuZXdDb250cm9scy5sZW5ndGggPT0gMCkKLQkJcmV0dXJuOwotCXNhc2hGb3JtLmNvbnRyb2xzID0gbmV3Q29udHJvbHM7Ci0JCi0JQ29udHJvbFtdIGNvbnRyb2xzID0gc2FzaEZvcm0uY29udHJvbHM7Ci0JCi0JaWYgKHNhc2hGb3JtLm1heENvbnRyb2wgIT0gbnVsbCAmJiAhc2FzaEZvcm0ubWF4Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBzYXNoRm9ybS5tYXhDb250cm9sKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKC0yMDAsIC0yMDAsIDAsIDApOwotCQkJfSBlbHNlIHsKLQkJCQljb250cm9sc1tpXS5zZXRCb3VuZHMoYXJlYSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBzaW1wbGUgbGF5b3V0Ci0JaWYgKHNpbXBsZSkgewotCQkvLyBoaWRlIHNhc2hlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgewotCQkJc2FzaEZvcm0uc2FzaGVzW2ldLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2FzaEZvcm0uc2FzaGVzW2ldLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCQotCQlQb2ludCBwID0gY29udHJvbHNbMF0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJY29udHJvbHNbMF0uc2V0Qm91bmRzKDAsIDAsIGFyZWEud2lkdGgsIHAueSk7Ci0JCWNvbnRyb2xzWzFdLnNldEJvdW5kcygwLCBwLnkgKyAyLCBhcmVhLndpZHRoLCBhcmVhLmhlaWdodCAtIHAueSAtIDIpOwotCQkKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBrZWVwIGp1c3QgdGhlIHJpZ2h0IG51bWJlciBvZiBzYXNoZXMKLQlpZiAoc2FzaEZvcm0uc2FzaGVzLmxlbmd0aCA8IGNvbnRyb2xzLmxlbmd0aCAtIDEpIHsKLQkJU2FzaFtdIG5ld1Nhc2hlcyA9IG5ldyBTYXNoW2NvbnRyb2xzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNhc2hGb3JtLnNhc2hlcywgMCwgbmV3U2FzaGVzLCAwLCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkgPCBuZXdTYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCW5ld1Nhc2hlc1tpXSA9IG5ldyBTYXNoKHNhc2hGb3JtLCBzYXNoRm9ybS5zYXNoU3R5bGUpOwotCQkJbmV3U2FzaGVzW2ldLnNldEJhY2tncm91bmQoc2FzaEZvcm0uYmFja2dyb3VuZCk7Ci0JCQluZXdTYXNoZXNbaV0uc2V0Rm9yZWdyb3VuZChzYXNoRm9ybS5mb3JlZ3JvdW5kKTsKLQkJCW5ld1Nhc2hlc1tpXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzYXNoRm9ybS5zYXNoTGlzdGVuZXIpOwotCQl9Ci0JCXNhc2hGb3JtLnNhc2hlcyA9IG5ld1Nhc2hlczsKLQl9Ci0JaWYgKHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPiBjb250cm9scy5sZW5ndGggLSAxKSB7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzYXNoRm9ybS5zYXNoZXNbaV0uZGlzcG9zZSgpOwotCQkJfQotCQkJc2FzaEZvcm0uc2FzaGVzID0gbmV3IFNhc2hbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTYXNoW10gbmV3U2FzaGVzID0gbmV3IFNhc2hbY29udHJvbHMubGVuZ3RoIC0gMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNhc2hGb3JtLnNhc2hlcywgMCwgbmV3U2FzaGVzLCAwLCBuZXdTYXNoZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSBjb250cm9scy5sZW5ndGggLSAxOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2FzaEZvcm0uc2FzaGVzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNhc2hGb3JtLnNhc2hlcyA9IG5ld1Nhc2hlczsKLQkJfQotCX0KLQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHJldHVybjsKLQlTYXNoW10gc2FzaGVzID0gc2FzaEZvcm0uc2FzaGVzOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNhc2hlc1tpXS5zZXRFbmFibGVkKHRydWUpOwotCQlzYXNoZXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JaWYgKHNhc2hGb3JtLnJlc2l6ZSkgewotCQlDb250cm9sIGMxID0gY29udHJvbHNbMF07Ci0JCUNvbnRyb2wgYzIgPSBjb250cm9sc1sxXTsKLQkJCi0JCWludCBoMSA9IGFyZWEuaGVpZ2h0IC8gMzsKLQkJaW50IGgyID0gYXJlYS5oZWlnaHQgLSBoMSAtIHNhc2hlc1swXS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQotCQlPYmplY3QgZGF0YTEgPSBjMS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhMSA9PSBudWxsIHx8ICEoZGF0YTEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7Ci0JCQlkYXRhMSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWMxLnNldExheW91dERhdGEoZGF0YTEpOwotCQl9Ci0JCU9iamVjdCBkYXRhMiA9IGMyLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEyID09IG51bGwgfHwgIShkYXRhMiBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGEyID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0JCX0KLQkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwICogaDEgLyBoMjsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCQlzYXNoRm9ybS5yZXNpemUgPSBmYWxzZTsKLQl9Ci0JCi0JLy8gZ2V0IHRoZSByYXRpb3MKLQlsb25nW10gcmF0aW9zID0gbmV3IGxvbmdbY29udHJvbHMubGVuZ3RoXTsKLQlsb25nIHRvdGFsID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCU9iamVjdCBkYXRhID0gY29udHJvbHNbaV0uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpIHsKLQkJCXJhdGlvc1tpXSA9ICgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljb250cm9sc1tpXS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJKChTYXNoRm9ybURhdGEpZGF0YSkud2VpZ2h0ID0gcmF0aW9zW2ldID0gKCgyMDAgPDwgMTYpICsgOTk5KSAvIDEwMDA7Ci0JCX0KLQkJdG90YWwgKz0gcmF0aW9zW2ldOwotCX0KLQkKLQlpbnQgc2FzaHdpZHRoID0gc2FzaGVzLmxlbmd0aCA+IDAgPyBzYXNoRm9ybS5TQVNIX1dJRFRIICsgc2FzaGVzIFswXS5nZXRCb3JkZXJXaWR0aCgpICogMiA6IHNhc2hGb3JtLlNBU0hfV0lEVEg7Ci0JaWYgKHNhc2hGb3JtLmdldE9yaWVudGF0aW9uKCkgPT0gU1dULkhPUklaT05UQUwpIHsKLQkJaW50IHdpZHRoID0gKGludCkocmF0aW9zWzBdICogKGFyZWEud2lkdGggLSBzYXNoZXMubGVuZ3RoICogc2FzaHdpZHRoKSAvIHRvdGFsKTsKLQkJaW50IHggPSBhcmVhLng7Ci0JCWNvbnRyb2xzWzBdLnNldEJvdW5kcyh4LCBhcmVhLnksIHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCXggKz0gd2lkdGg7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY29udHJvbHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlzYXNoZXNbaSAtIDFdLnNldEJvdW5kcyh4LCBhcmVhLnksIHNhc2h3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJeCArPSBzYXNod2lkdGg7Ci0JCQl3aWR0aCA9IChpbnQpKHJhdGlvc1tpXSAqIChhcmVhLndpZHRoIC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCQljb250cm9sc1tpXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJeCArPSB3aWR0aDsKLQkJfQotCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMSkgewotCQkJc2FzaGVzW3Nhc2hlcy5sZW5ndGggLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCBzYXNod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCXggKz0gc2FzaHdpZHRoOwotCQkJd2lkdGggPSBhcmVhLndpZHRoIC0geDsKLQkJCWNvbnRyb2xzW2NvbnRyb2xzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyh4LCBhcmVhLnksIHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgaGVpZ2h0ID0gKGludCkocmF0aW9zWzBdICogKGFyZWEuaGVpZ2h0IC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCWludCB5ID0gYXJlYS55OwotCQljb250cm9sc1swXS5zZXRCb3VuZHMoYXJlYS54LCB5LCBhcmVhLndpZHRoLCBoZWlnaHQpOwotCQl5ICs9IGhlaWdodDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb250cm9scy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCXNhc2hlc1tpIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgc2FzaHdpZHRoKTsKLQkJCXkgKz0gc2FzaHdpZHRoOwotCQkJaGVpZ2h0ID0gKGludCkocmF0aW9zW2ldICogKGFyZWEuaGVpZ2h0IC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCQljb250cm9sc1tpXS5zZXRCb3VuZHMoYXJlYS54LCB5LCBhcmVhLndpZHRoLCBoZWlnaHQpOwotCQkJeSArPSBoZWlnaHQ7Ci0JCX0KLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDEpIHsKLQkJCXNhc2hlc1tzYXNoZXMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgc2FzaHdpZHRoKTsKLQkJCXkgKz0gc2FzaHdpZHRoOwotCQkJaGVpZ2h0ID0gYXJlYS5oZWlnaHQgLSB5OwotCQkJY29udHJvbHNbY29udHJvbHMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJfQotCX0KLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50Vmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTAwYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotLyoqCi0gKiBFZGl0YWJsZSB2aWV3ZXIgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jb250ZW50Vmlld2VyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIGF1dG9tYXRpY2FsbHkgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXdlciB3aGVuIHJlcXVpcmVkLgotICogT25jZSBpbnN0YW50aWF0ZWQsIHtAbGluayAjaW5pdChDb21wb3NpdGUpfSBpcyBjYWxsZWQgdG8gY3JlYXRlCi0gKiB0aGUgdmlld2VyJ3MgY29udHJvbHMuIFRoZW4ge0BsaW5rICNzZXRDb250ZW50KGJ5dGVbXSl9IGlzIGNhbGxlZCwKLSAqIG9uZSBvciBtb3JlIHRpbWVzLCB0byBjYXVzZSB0aGUgdmlld2VyIHRvIGRpc3BsYXkgcGFydGljdWxhcgotICogY29udGVudC4gRmluYWxseSwgd2hlbiB0aGUgdmlld2VyIGlzIG5vIGxvbmdlciBuZWVkZWQsIHtAbGluayAjZGlzcG9zZSgpfQotICogaXMgY2FsbGVkIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyB0aWVkIHVwIGJ5IHRoZSB2aWV3ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFtpc3N1ZTogSXQncyB1bmNsZWFyIGhvdyB0aGVzZSBjb250ZW50IHZpZXdlcnMgYXJlIHVzZWQuCi0gKiBJcyBpdCBqdXN0IHRoYXQgdGhlIFVJIHByb3ZpZGVzIGEgbGlzdCBvZiBhdmFpbGFibGUKLSAqIHZpZXdzIGZvciB0aGUgdXNlciB0byBtYWtlIGEgbWFudWFsIHNlbGVjdGlvbiBmcm9tLCByZWdhcmRsZXNzCi0gKiBvZiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgdHJhZmZpYz9dCi0gKiA8L3A+Ci0gKiBbaXNzdWU6IENTIC0gSWYgYSBDb250ZW50Vmlld2VyIGlzIGVkaXRhYmxlLCBkb2VzIHRoYXQgbWVhbiB3ZSBjYW4gZWRpdCB0aGUgCi0gKiBieXRlcyBvZiB0aGUgbWVzc2FnZSBhbmQgcmVzZW5kIGl0IGFjcm9zcyB0aGUgd2lyZT8gIEhvdyBpcyBhbiBlZGl0YWJsZSBDb250ZW50Vmlld2VyCi0gKiBoYW5kbGVkIGRpZmZlcmVudGx5IGJ5IHRoZSBmcmFtZXdvcms/IFBlcmhhcHMgYW4gZXhhbXBsZSBvZiB3aGF0IGFuIGVkaXRlYWJsZSB2aWV3ZXIgd291bGQgZG8uIF0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRWaWV3ZXIgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB2aWV3ZXIgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhpcyB2aWV3ZXIgYXMgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCB0aGF0IHRoZSB2aWV3ZXIgc2hvdWxkIGRpc3BsYXkuCi0JICogVGhlIHBhcmFtZXRlciBtYXkgYmUgbnVsbCBpZiBubyBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgaXMgZm9yIGRpc3BsYXlpbmcgcmVxdWVzdC1yZXBvbnNlIG1lc3NhZ2VzLAotCSAqIHdoeSBub3QgcGFzcyBhbiBSZXF1ZXN0PyBUaGUgcHJvYmxlbSBhcyBpdCBzdGFuZHMgbm93IGlzIHRoYXQKLQkgKiBpdCBpcyB1bmNsZWFyIGZyb20gc3BlY3MgaG93IGNvbnRlbnQgdmlld2VycyByZWxhdGUgdG8gYW55dGhpbmcKLQkgKiBlbHNlIGhhdmluZyB0byBkbyB3aXRoIHRoZSBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGIgdGhlIGNvbnRlbnQgdG8gZGlzcGxheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBkaXNwbGF5IG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSB2aWV3ZXIuIFRoaXMgaXMgdXN1YWxseSBvbmx5IGludGVyZXN0aW5nIGlmIHRoZQotCSAqIGNvbnRlbnQgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGFuZAotCSAqIHJldHVybnMgbnVsbC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZnJvbSB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIHZpZXdlciBhbmQgYW55IHVuZGVybHlpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgYSBjb21wb3NpdGUuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc3dpdGNoZXMgdG8gdXNlIGFub3RoZXIKLQkgKiB2aWV3ZXIgb3IgdGhlIG1vbml0b3IgdmlldyBpcyBjbG9zZWQuIFRoZSBwYXJlbnQgY29tcG9zaXRlIHNob3VsZCBub3QKLQkgKiBiZSBkaXNwb3NlZCBzaW5jZSBpdCBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IGFub3RoZXIgdmlld2VyLiAKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBjbGVhbnVwLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cnVlIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJ1ZSB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWE0NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvclVJQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotLyoqCi0gKiBNYWluIGNsYXNzIGZvciBhY2Nlc3MgdG8gdGhlIG1vbml0b3IgVUkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4gSXQgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JVSUNvcmUgewotCS8qKgotCSAqIENhbm5vdCBjcmVhdGUgTW9uaXRvclVJQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIE1vbml0b3JVSUNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlcXVlc3RzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIFRDUC9JUAotCSAqIG1vbml0b3Igdmlldy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcXVlc3RbXSBnZXRSZXF1ZXN0cygpIHsKLQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhiNmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VENQL0lQIG1vbml0b3IgVUk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgQ29udGVudFZpZXdlciBjbGFzcyBpcyBwcm92aWRlZCB0bwotaW1wbGVtZW50IHRoZSB2aWV3ZXJzIGV4dGVuc2lvbiBwb2ludCB0aGF0IGFsbG93cyBleHRlcm5hbCBwbHVnaW5zIHRvIHByb3ZpZGUKLWEgdmlldyBmb3Igdmlld2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBkYXRhIGNvbnRlbnQgaW4gdGhlIG1vbml0b3Igdmlldy4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDFhMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxhYnN0cmFjdD5UQ1AvSVAgbW9uaXRvciBVSTwvYWJzdHJhY3Q+Ci0KLTxwPlRoZSBDb250ZW50Vmlld2VyIGNsYXNzIGlzIHByb3ZpZGVkIHRvCi1pbXBsZW1lbnQgdGhlIHZpZXdlcnMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgYWxsb3dzIGV4dGVybmFsIHBsdWdpbnMgdG8gcHJvdmlkZQotYSB2aWV3IGZvciB2aWV3aW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGRhdGEgY29udGVudCBpbiB0aGUgbW9uaXRvciB2aWV3LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGQ4M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOwotCXByb3RlY3RlZCBJQ29udGVudEZpbHRlciBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCXB1YmxpYyBGaWx0ZXJBY3Rpb24oVmlld2VyTWFuYWdlciB2bSwgSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGZpbHRlci5nZXROYW1lKCksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJdGhpcy52bSA9IHZtOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzQ2hlY2tlZCgpKQotCQkJdm0ucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0JCWVsc2UKLQkJCXZtLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vZGlmeU1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWYwZjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb2RpZnkgdGhlIHNlbGVjdGVkIG1lc3NhZ2UuIENyZWF0ZXMgYSBuZXcgcmVzZW5kcmVxdWVzdCBhbmQgYWRkcyBpdAotICogdG8gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDVlYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JLyoqCi0JICogUHJveHlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRha2UgYSBWaWV3ZXIsCi0JICogcmVuYW1lZCBhbmQgcmVwdXJwb3NlZCB0byBkaXNjb25uZWN0IGEgY29udGVudCBwcm92aWRlciBmcm9tCi0JICogYSB2aWV3ZXIuIFRoaXMgaXMgb3ZlciBhbmQgYWJvdmUgd2hhdCBpbnB1dENoYW5nZWQgZG9lcywKLQkgKiB3aGljaCBpcyBkaXNjb25uZWN0aW5nIGEgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSB2aWV3ZXIncwotCSAqIGlucHV0IChidXQgbm90IHRoZSB2aWV3ZXIgaXRzZWxmKS4KLQkgKiBdCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIAotCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzPC9jb2RlPiBpcwotCSAqIHRoYXQgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIAotCSAqIHRyZWUgdmlld2VyJ3Mgcm9vdCBlbGVtZW50cywgd2hlcmVhcyA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgdXNlZAotCSAqIHRvIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlCi0JICogKGluY2x1ZGluZyBhIHJvb3QpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IERvbid0IGtub3cgd2hhdCBhYm92ZSBpcyB0cnlpbmcgdG8gc2F5LgotCSAqICBTZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMuCi0JICogXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjaGlsZCBlbGVtZW50cyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKLQkJCUxpc3Q8UmVxdWVzdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQkJCVJlcXVlc3RbXSByZXF1ZXN0cyA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JCQlpZiAocmVxdWVzdHMgIT0gbnVsbCkgewotCQkJCWZvciAoUmVxdWVzdCByZXEgOiByZXF1ZXN0cykgewotCQkJCQlpZiAoKHJlcS5nZXRMb2NhbFBvcnQoKSA9PSBpbi5pbnRWYWx1ZSgpKQotCQkJCQkJCSYmICEocmVxIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKQotCQkJCQkJbGlzdC5hZGQocmVxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlSZXNlbmRIVFRQUmVxdWVzdFtdIHJyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNlbmRSZXF1ZXN0cyhyZXEpOwotCQkJTGlzdDxSZXF1ZXN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOwotCQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlc2VuZEhUVFBSZXF1ZXN0IHIgOiBycikKLQkJCQkJbGlzdC5hZGQocik7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUKLQkgKiBnaXZlbiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwKLQkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCQlSZXF1ZXN0W10gcmVxdWVzdHMgPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXF1ZXN0cygpOwotCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlcXVlc3QgcmVxIDogIHJlcXVlc3RzKSB7Ci0JCQkJCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihyZXEuZ2V0TG9jYWxQb3J0KCkpOwotCQkJCQlpZiAoIWxpc3QuY29udGFpbnMoaW4pKQotCQkJCQkJbGlzdC5hZGQoaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKLQkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJCXJldHVybiBST09UOwotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlpZiAoY2FsbCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgY2FsbFJlc2VuZCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgY2FsbDsKLQkJCQlSZXF1ZXN0IHBhcmVudCA9IGNhbGxSZXNlbmQuZ2V0T3JpZ2luYWxSZXF1ZXN0KCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNhbGwuZ2V0TG9jYWxQb3J0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KQotCQkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzZW5kUmVxdWVzdHMoKFJlcXVlc3QpIGVsZW1lbnQpLmxlbmd0aCA+IDA7IAotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0JICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzg4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSUNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklSZXF1ZXN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLio7Ci0vKioKLSAqIFZpZXcgb2YgVENQL0lQIGFjdGl2aXR5LgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByb3RlY3RlZCBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgVmlld2VyTWFuYWdlciB2bTsKLQlwcm90ZWN0ZWQgTGlzdCByZXF1ZXN0Vmlld2VyczsKLQlwcm90ZWN0ZWQgTGlzdCByZXNwb25zZVZpZXdlcnM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudmlldyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WSUVXRVIgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIjsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGh0dHBIZWFkZXJBY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gcHJlZmVyZW5jZUFjdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIE1vbml0b3JWaWV3IHZpZXc7Ci0JCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3VycmVudFJlcXVlc3QgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogTW9uaXRvclZpZXcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JCXZpZXcgPSB0aGlzOwotCQkKLQkJLy8gdHJ5IHNwZWNpZmllZCBmb3JtYXQsIGFuZCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgZm9ybWF0Ci0JCXRyeSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChNZXNzYWdlcy52aWV3RGF0ZUZvcm1hdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiaDptbS5zLlMgYSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9SZXF1ZXN0QWRkZWQoZmluYWwgUmVxdWVzdCBycikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghKHJyIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKSB7Ci0JCQkJICB0cmVlVmlld2VyLnJlZnJlc2goTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQkJICBpZiAoIU1vbml0b3JVSVBsdWdpbi5nZXRQaW5WaWV3UHJlZmVyZW5jZSgpKQotCQkJCQkgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJyKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlcXVlc3RDaGFuZ2VkKGZpbmFsIFJlcXVlc3QgcnIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChycik7Ci0JCQkJaWYgKCFzZWwuaXNFbXB0eSgpKQotCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl0cmVlVmlld2VyLnNldElucHV0KE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVxdWVzdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNhc2hGb3JtIHNhc2hGcGFyZW50ID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDQ7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRnBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEZwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2FzaEZwYXJlbnQsIENvbnRleHRJZHMuVklFVyk7Ci0JCQotCQkvLyBjcmVhdGUgdHJlZSBwYW5lbAotCQlDb21wb3NpdGUgdHJlZVBhbmVsID0gbmV3IENvbXBvc2l0ZShzYXNoRnBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0cmVlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTEwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHJlZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCXRyZWUgPSBuZXcgVHJlZSh0cmVlUGFuZWwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMTIwOwotCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlLCBDb250ZXh0SWRzLlZJRVdfVFJFRSk7Ci0JCi0JCUNvbXBvc2l0ZSBkZXRhaWxzUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHRyZWVQYW5lbCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZXRhaWxzUGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQlsYWJlbDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoZGV0YWlsc1BhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsMy5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUeXBlLCAiIikpOwotCQlsYWJlbDMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQkvLyBjcmVhdGUgY2VudGVyIGFuZCByaWdodCBwYW5lbHMKLQkJU2FzaEZvcm0gc2FzaEZjaGlsZCA9IG5ldyBTYXNoRm9ybShzYXNoRnBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRmNoaWxkLnNldExheW91dChsYXlvdXQpOwotCQlzYXNoRnBhcmVudC5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQkJCi0JCS8vIHJlcXVlc3QgcGFuZWwKLQkJQ29tcG9zaXRlIHJlcXVlc3QgPSBuZXcgQ29tcG9zaXRlKHNhc2hGY2hpbGQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyZXF1ZXN0LnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJQ29tcG9zaXRlIHJlcXVlc3RIZWFkZXIgPSBuZXcgQ29tcG9zaXRlKHJlcXVlc3QsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0TGFiZWwgPSBuZXcgTGFiZWwocmVxdWVzdEhlYWRlciwgU1dULk5PTkUpOwotCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgIiIpKTsKLQkJcmVxdWVzdExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJZmluYWwgQ29tYm8gcmVxdWVzdFZpZXdlckNvbWJvID0gbmV3IENvbWJvKHJlcXVlc3RIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVxdWVzdFZpZXdlckNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0U2l6ZUxhYmVsID0gbmV3IExhYmVsKHJlcXVlc3RIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOwotCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gcmVzcG9uc2UgcGFuZWwKLQkJQ29tcG9zaXRlIHJlc3BvbnNlID0gbmV3IENvbXBvc2l0ZShzYXNoRmNoaWxkLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVzcG9uc2Uuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3BvbnNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByZXNwb25zZUhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVzcG9uc2UsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXNwb25zZUhlYWRlci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVzcG9uc2VIZWFkZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIExhYmVsIHJlc3BvbnNlTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCWZpbmFsIENvbWJvIHJlc3BvbnNlVmlld2VyQ29tYm8gPSBuZXcgQ29tYm8ocmVzcG9uc2VIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZmluYWwgTGFiZWwgcmVzcG9uc2VTaXplTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvLyB2aWV3ZXIgbWFuYWdlcgotCQl2bSA9IG5ldyBWaWV3ZXJNYW5hZ2VyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQkJcmVxdWVzdFZpZXdlcnMgPSB2bS5nZXRSZXF1ZXN0Vmlld2VycygpOwotCQlyZXNwb25zZVZpZXdlcnMgPSB2bS5nZXRSZXNwb25zZVZpZXdlcnMoKTsKLQkJCi0JCS8vIHNldCB1cCB0aGUgdmlld2VyIGNvbWJvIGJveGVzCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVxdWVzdFZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJaW50IGN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXF1ZXN0Vmlld2VyQ29tYm8uYWRkKHZpZXdlci5nZXRMYWJlbCgpLCBjdHIpOwotCQkJaWYgKHZpZXdlci5nZXRJZCgpLmVxdWFscyhERUZBVUxUX1ZJRVdFUikpIHsKLQkJCQlyZXF1ZXN0Vmlld2VyQ29tYm8uc2VsZWN0KGN0cik7IAotCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlcXVlc3RWaWV3ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIHJlcXVlc3RWaWV3ZXJzLmdldChyZXF1ZXN0Vmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXF1ZXN0LXZpZXdlciIsIHZpZXdlci5nZXRJZCgpKTsKLQkJCQl2bS5zZXRSZXF1ZXN0Vmlld2VyKHZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0pOwotCQlyZXF1ZXN0SGVhZGVyLmxheW91dCh0cnVlKTsKLQkJCi0JCWl0ZXJhdG9yID0gcmVzcG9uc2VWaWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCWN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXNwb25zZVZpZXdlckNvbWJvLmFkZCh2aWV3ZXIuZ2V0TGFiZWwoKSwgY3RyKTsKLQkJCWlmICh2aWV3ZXIuZ2V0SWQoKS5lcXVhbHMoREVGQVVMVF9WSUVXRVIpKSB7Ci0JCQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZWxlY3QoY3RyKTsgCi0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlc3BvbnNlVmlld2VyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSByZXNwb25zZVZpZXdlcnMuZ2V0KHJlc3BvbnNlVmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXNwb25zZS12aWV3ZXIiLCB2aWV3ZXIuZ2V0SWQoKSk7Ci0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfSk7Ci0JCXJlc3BvbnNlSGVhZGVyLmxheW91dCh0cnVlKTsKLQotCQkvLyBzZWxlY3Rpb24gbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQljdXJyZW50UmVxdWVzdCA9IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbDsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcXVlc3QpCi0JCQkJCQljdXJyZW50UmVxdWVzdCA9IChSZXF1ZXN0KSBvYmo7Ci0JCQkJfQotCQotCQkJCWlmIChjdXJyZW50UmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1RpbWUsIGZvcm1hdC5mb3JtYXQoY3VycmVudFJlcXVlc3QuZ2V0RGF0ZSgpKSkpOwotCQotCQkJCQlpZiAoY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgPT0gLTEpCi0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyB0aW1lID0gTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZUZvcm1hdCwgY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgKyAiIik7Ci0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCB0aW1lKSk7Ci0JCQkJCX0KLQkJCQkJbGFiZWwzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1R5cGUsIGN1cnJlbnRSZXF1ZXN0LmdldFByb3RvY29sKCkpKTsKLQkKLQkJCQkJLy8gcmVxdWVzdCBpbmZvcm1hdGlvbgotCQkJCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgImxvY2FsaG9zdDoiICsgY3VycmVudFJlcXVlc3QuZ2V0TG9jYWxQb3J0KCkpKTsKLQkJCQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoY3VycmVudFJlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpLCBjdXJyZW50UmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKSkpOwotCQotCQkJCQkvLyByZXNwb25zZSBpbmZvcm1hdGlvbgotCQkJCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkgKyAiOiIgKyBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVQb3J0KCkpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChnZXRTaXplU3RyaW5nKGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCksIGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSkpOwotCQkJCQkKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJCQotCQkJCQlWaWV3ZXIgdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdC12aWV3ZXIiKSk7Ci0JCQkJCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCQkJCXZpZXdlciA9IHZtLmZpbmRWaWV3ZXIoREVGQVVMVF9WSUVXRVIpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlcXVlc3RWaWV3ZXJDb21iby5zZWxlY3QocmVxdWVzdFZpZXdlcnMuaW5kZXhPZih2aWV3ZXIpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVzcG9uc2Utdmlld2VyIikpOwotCQkJCQlpZiAodmlld2VyID09IG51bGwgJiYgY3VycmVudFJlcXVlc3QuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQkJCQl2aWV3ZXIgPSB2bS5nZXREZWZhdWx0Vmlld2VyKGN1cnJlbnRSZXF1ZXN0LmdldE5hbWUoKSk7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlc3BvbnNlVmlld2VyQ29tYm8uc2VsZWN0KHJlc3BvbnNlVmlld2Vycy5pbmRleE9mKHZpZXdlcikpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJCQkJbGFiZWwyLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZSwgIiIpKTsKLQkJCQkJcmVxdWVzdExhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1JlcXVlc3QsICIiKSk7Ci0JCQkJCXJlcXVlc3RTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQkKLQkJLy8gY3JlYXRlIGEgbWVudSBtYW5hZ2VyIGZvciBhIGNvbnRleHQgbWVudQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJCW1lbnUuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGhlIG1lbnUKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodHJlZVZpZXdlci5nZXRDb250cm9sKCkpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQkKLQkJLy8gcmVnaXN0ZXIgdGhlIG1lbnUgd2l0aCB0aGUgcGxhdGZvcm0KLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHRyZWVWaWV3ZXIpOwotICAgICAgICAKLQkJaW5pdGlhbGl6ZUFjdGlvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaXplU3RyaW5nKGJ5dGVbXSBhLCBieXRlW10gYikgewotCQlTdHJpbmcgYWEgPSAiMCI7Ci0JCVN0cmluZyBiYiA9ICIwIjsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWFhID0gYS5sZW5ndGggKyAiIjsKLQkJaWYgKGIgIT0gbnVsbCkKLQkJCWJiID0gYi5sZW5ndGggKyAiIjsKLQkJU3RyaW5nIHNpemUgPSBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZUZvcm1hdCwgbmV3IE9iamVjdFtdIHsgYWEsIGJifSk7Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgc2l6ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0cmVlVmlld2VyID0gbnVsbDsKLQkJdmlldyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdG9vbC1iYXIgYW5kIG1lbnUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWN0aW9ucygpIHsKLQkJZmluYWwgSUFjdGlvbiBwaW5BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJvb2xlYW4gcGluID0gTW9uaXRvclVJUGx1Z2luLmdldFBpblZpZXdQcmVmZXJlbmNlKCk7Ci0JCQkJCQlNb25pdG9yVUlQbHVnaW4uc2V0UGluVmlld1ByZWZlcmVuY2UoIXBpbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJcGluQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlwaW5BY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUGluKTsKLQkJcGluQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9QSU4pKTsKLQkJcGluQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1BJTikpOwotCQlwaW5BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfUElOKSk7Ci0JCQotCQkKLQkJZmluYWwgSUFjdGlvbiBzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh0cmVlVmlld2VyLmdldENvbXBhcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFJlcXVlc3RDb21wYXJhdG9yKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXRDaGVja2VkKGZhbHNlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUpKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSkpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FKSk7Ci0JCi0JCUlBY3Rpb24gY2xlYXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmNsZWFyUmVxdWVzdHMoKTsKLQkJCQljbGVhcigpOwotCQkJfQotCQl9OwotCQljbGVhckFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25DbGVhclRvb2xUaXApOwotCQljbGVhckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0VMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfQ0xFQVIpKTsKLQotCQlodHRwSGVhZGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlib29sZWFuIGIgPSB2bS5nZXREaXNwbGF5SGVhZGVySW5mbygpOwotCQkJCQkJdm0uc2V0RGlzcGxheUhlYWRlckluZm8oIWIpOwotCQkJCQkJc2V0Q2hlY2tlZCghYik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJaHR0cEhlYWRlckFjdGlvbi5zZXRDaGVja2VkKHZtLmdldERpc3BsYXlIZWFkZXJJbmZvKCkpOwotCQlodHRwSGVhZGVyQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2hvd0hlYWRlcik7Ci0KLQkJcHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2hvd1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByZWZlcmVuY2VBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9wZXJ0aWVzKTsKLQkJCi0JCQotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJdGJtLmFkZChzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24pOwotCQl0Ym0uYWRkKGNsZWFyQWN0aW9uKTsKLQkJdGJtLmFkZChwaW5BY3Rpb24pOwotCQkKLQkJSUNvbnRlbnRGaWx0ZXJbXSBmaWx0ZXJzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXJzKCk7Ci0JCUlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChodHRwSGVhZGVyQWN0aW9uKTsKLQkJZm9yIChJQ29udGVudEZpbHRlciBjZiA6IGZpbHRlcnMpIHsKLQkJCUZpbHRlckFjdGlvbiBhY3Rpb24gPSBuZXcgRmlsdGVyQWN0aW9uKHZtLCBjZik7Ci0JCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJfQotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBtYW5hZ2VyLmZpbmQoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiKTsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJbWFuYWdlcjIuYWRkVG9Sb290KG5vZGUpOwotCQkKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQkJCXJlc3VsdFswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCQotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCi0JCQkJCUlWaWV3UGFydCB2aWV3MiA9IHBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldzIgIT0gbnVsbCkKLQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldyAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4uZ2V0UGluVmlld1ByZWZlcmVuY2UoKSkKLQkJCQkJCXZpZXcuc2V0U2VsZWN0aW9uKHJlcXVlc3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgVENQL0lQIHZpZXciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAodHJlZSAhPSBudWxsKQotCQkJdHJlZS5zZXRGb2N1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVxdWVzdENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVxdWVzdENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3YjY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1JlcXVlc3RDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdENvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKLQkvKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgbzIgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQlSZXF1ZXN0IHIxID0gKFJlcXVlc3QpIG8xOwotCQkJUmVxdWVzdCByMiA9IChSZXF1ZXN0KSBvMjsKLQkJCWlmIChyMS5nZXRSZXNwb25zZVRpbWUoKSA8IHIyLmdldFJlc3BvbnNlVGltZSgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgbzEsIG8yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXNlbmRNZXNzYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMDRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogUmVzZW5kcyB0aGUgc2VsZWN0ZWQgcmVxdWVzdCBhbmQgYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlbmRNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgbmV3UmVxID0gTW9uaXRvck1hbmFnZXIuY3JlYXRlUmVzZW5kUmVxdWVzdChyZXEpOwotCQkJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUmVzZW5kUmVxdWVzdChyZXEsIG5ld1JlcSk7Ci0JCQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gTW9uaXRvclZpZXcudmlldy50cmVlVmlld2VyOwotCQkJCXRyZWVWaWV3ZXIuYWRkKHJlcSwgbmV3UmVxKTsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdSZXEpLCBmYWxzZSk7Ci0JCQkJbmV3UmVxLnNlbmRSZXF1ZXN0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uMikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGI0MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkhlYWRlclZpZXdlcjsKLS8qKgotICogU2VuZCBhIG1vZGlmaWVkIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkgewotCQkJCVJlc2VuZEhUVFBSZXF1ZXN0IHJlcSA9IChSZXNlbmRIVFRQUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlDb250ZW50Vmlld2VyIGN1clZpZXdlciA9IE1vbml0b3JWaWV3LnZpZXcudm0uZ2V0Q3VycmVudFJlcXVlc3RWaWV3ZXIoKTsKLQkJCQlIZWFkZXJWaWV3ZXIgY3VySGVhZGVyVmlld2VyID0gTW9uaXRvclZpZXcudmlldy52bS5nZXRDdXJyZW50UmVxdWVzdEhlYWRlclZpZXdlcigpOwotCQkJCXJlcS5zZXRSZXF1ZXN0KGN1clZpZXdlci5nZXRDb250ZW50KCksIFJlcXVlc3QuQ09OVEVOVCk7Ci0JCQkJCi0JCQkJaWYgKGN1ckhlYWRlclZpZXdlciAhPSBudWxsKQotCQkJCQlyZXEuc2V0UmVxdWVzdChjdXJIZWFkZXJWaWV3ZXIuZ2V0Q29udGVudCgpLCBSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0KLQkJCQlyZXEuc2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWMxZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50IGZvciB1c2UKLQkgKiBpbiB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpIHsKLQkJCQlpZiAoISgoUmVzZW5kSFRUUFJlcXVlc3QpIGVsZW1lbnQpLmhhc0JlZW5TZW50KCkpCi0JCQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfUkVRVUVTVF9SRVNQT05TRSk7Ci0JCX0KLQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX0hPU1QpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50IGZvciB1c2UKLQkgKiBpbiB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgY2FsbCA9IChSZXF1ZXN0KSBlbGVtZW50OwotCQkJcmV0dXJuIGNhbGwuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gImxvY2FsaG9zdDoiICsgaW4uaW50VmFsdWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCAKLQkgKiBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4ZjkzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Vmlld2VyIGNyZWF0ZVZpZXdlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQ29udGVudFZpZXdlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB2aWV3ZXIiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyZXF1ZXN0IikgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlVmlld2VyKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlc3BvbnNlIikgPj0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbnRlbnRWaWV3ZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NDQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklDb250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuQnl0ZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkhlYWRlclZpZXdlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJNYW5hZ2VyIHsKLQlwcml2YXRlIGJvb2xlYW4gZGlzcGxheUhlYWRlckluZjsKLQotCXByb3RlY3RlZCBDb250ZW50Vmlld2VyIHJlcVZpZXdlcjsKLQlwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXNwVmlld2VyOwotCXByb3RlY3RlZCBWaWV3ZXIgcmVxdWVzdFZpZXdlcjsKLQlwcm90ZWN0ZWQgVmlld2VyIHJlc3BvbnNlVmlld2VyOwotCi0JcHJvdGVjdGVkIEhlYWRlclZpZXdlciByZXFIZWFkZXI7Ci0JcHJvdGVjdGVkIEhlYWRlclZpZXdlciByZXNwSGVhZGVyOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSByZXFDb21wOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVzcENvbXA7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxWaWV3ZXI+IHZpZXdlcnM7Ci0KLQlwcm90ZWN0ZWQgUmVxdWVzdCByZXF1ZXN0OwotCi0JcHJvdGVjdGVkIFNhc2hGb3JtIHJlcVNhc2g7Ci0JcHJvdGVjdGVkIFNhc2hGb3JtIHJlc3BTYXNoOwotCi0JcHJvdGVjdGVkIExpc3Q8SUNvbnRlbnRGaWx0ZXI+IGZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PElDb250ZW50RmlsdGVyPigpOwotCi0JcHVibGljIFZpZXdlck1hbmFnZXIoQ29tcG9zaXRlIHJlcVBhcmVudCwgQ29tcG9zaXRlIHJlc3BQYXJlbnQpIHsKLQkJcmVxU2FzaCA9IG5ldyBTYXNoRm9ybShyZXFQYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVxU2FzaC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVxU2FzaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCXJlc3BTYXNoID0gbmV3IFNhc2hGb3JtKHJlc3BQYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJlc3BTYXNoLnNldExheW91dChsYXlvdXQpOwotCQlyZXNwU2FzaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCXJlcUNvbXAgPSByZXFTYXNoOwotCQlyZXNwQ29tcCA9IHJlc3BTYXNoOwotCQkKLQkJcmVxSGVhZGVyID0gbmV3IEhlYWRlclZpZXdlcihyZXFTYXNoLCBIZWFkZXJWaWV3ZXIuUkVRVUVTVF9IRUFERVIpOwotCQlyZXNwSGVhZGVyID0gbmV3IEhlYWRlclZpZXdlcihyZXNwU2FzaCwgSGVhZGVyVmlld2VyLlJFU1BPTlNFX0hFQURFUik7Ci0JCXJlcVZpZXdlciA9IG5ldyBCeXRlVmlld2VyKCk7Ci0JCXJlcVZpZXdlci5pbml0KHJlcVNhc2gpOwotCQlyZXNwVmlld2VyID0gbmV3IEJ5dGVWaWV3ZXIoKTsKLQkJcmVzcFZpZXdlci5pbml0KHJlc3BTYXNoKTsKLQkJCi0JCXJlcVNhc2guc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxMCwgOTAgfSk7Ci0JCXJlc3BTYXNoLnNldFdlaWdodHMobmV3IGludFtdIHsgMTAsIDkwIH0pOwotCQkKLQkJc2V0RGlzcGxheUhlYWRlckluZm8oTW9uaXRvclVJUGx1Z2luLmdldFNob3dIZWFkZXJQcmVmZXJlbmNlKCkpOwotCQlsb2FkQXZhaWxhYmxlVmlld2VycygpOwotCX0KLQotCXByb3RlY3RlZCBWaWV3ZXIgZ2V0RGVmYXVsdFZpZXdlcihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgbmFtZTIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7IAotCQlpZiAobmFtZTIuZW5kc1dpdGgoIi54bWwiKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLnhtbCIpOwotCQllbHNlIGlmIChuYW1lMi5lbmRzV2l0aCgiLmh0bWwiKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJyb3dzZXIiKTsKLQkJZWxzZSBpZiAobmFtZTIuZW5kc1dpdGgoIi5naWYiKSB8fCBuYW1lMi5lbmRzV2l0aCgiLmpwZyIpIHx8Ci0JCQkJbmFtZTIuZW5kc1dpdGgoIi5qcGVnIikgfHwgbmFtZTIuZW5kc1dpdGgoIi5wbmciKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmltYWdlIik7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJ5dGUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIGZpbmRWaWV3ZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHModmlld2VyLmdldElkKCkpKQotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRBdmFpbGFibGVWaWV3ZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lELCAidmlld2VycyIpOwotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJdmlld2VycyA9IG5ldyBBcnJheUxpc3Q8Vmlld2VyPihzaXplKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikKLQkJCXZpZXdlcnMuYWRkKG5ldyBWaWV3ZXIoY2UpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldERpc3BsYXlIZWFkZXJJbmZvKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheUhlYWRlckluZm8oYm9vbGVhbiBiKSB7Ci0JCWRpc3BsYXlIZWFkZXJJbmYgPSBiOwotCQlyZXFIZWFkZXIuc2V0RGlzcGxheUhlYWRlcihiKTsKLQkJcmVzcEhlYWRlci5zZXREaXNwbGF5SGVhZGVyKGIpOwotCQlyZXFTYXNoLnNldFNpbXBsZUxheW91dChiKTsKLQkJcmVzcFNhc2guc2V0U2ltcGxlTGF5b3V0KGIpOwotCQlyZXFTYXNoLmxheW91dCh0cnVlKTsKLQkJcmVzcFNhc2gubGF5b3V0KHRydWUpOwotCQkKLQkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGIpOwotCQlpZiAoYikgewotCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCkgPT0gbnVsbCkgewotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0RGlzcGxheUhlYWRlckluZm8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc3BsYXlIZWFkZXJJbmZvKCkgewotCQlyZXR1cm4gZGlzcGxheUhlYWRlckluZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcnIpIHsKLQkJLy8gbWFpbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSByZXF1ZXN0IGFuZCByZXF1ZXN0IGhlYWRlciBpZiB0aGV5J3ZlIGJlZW4gbW9kaWZpZWQuCi0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCkgPT0gbnVsbCkgewotCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVzUmVxdWVzdCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgcmVxdWVzdDsKLQkJCS8vRWRpdGFibGVDb250ZW50Vmlld2VyIGVkaXRWaWV3ZXIgPSAoQ29udGVudFZpZXdlcikgcmVxVmlld2VyOwotCQkJYnl0ZVtdIGNvbnRlbnQgPSByZXFWaWV3ZXIuZ2V0Q29udGVudCgpOwotCQkJYnl0ZVtdIGIgPSByZXNSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShjb250ZW50KSkpIHsKLQkJCQlyZXNSZXF1ZXN0LnNldFJlcXVlc3QoY29udGVudCwgUmVxdWVzdC5DT05URU5UKTsKLQkJCX0KLQkJCWJ5dGVbXSBoZWFkZXIgPSByZXFIZWFkZXIuZ2V0Q29udGVudCgpOwotCQkJYiA9IHJlc1JlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0JCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShoZWFkZXIpKSkgewotCQkJCXJlc1JlcXVlc3Quc2V0UmVxdWVzdChoZWFkZXIsIFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCX0KLQkJfQotCQlyZXFIZWFkZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJcmVzcEhlYWRlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXFWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXNwb25zZShSZXF1ZXN0LkNPTlRFTlQpKTsKLQkJcmVzcFZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXF1ZXN0ID0gcnI7Ci0JCQotCQkvLyBzZXQgdGhlIGVkaXRvciB0byBlZGl0YWJsZSBpZiB0aGUgcmVxdWVzdCBoYXNuJ3QgYmVlbiBzZW50IGFuZCB0aGUKLQkJLy8gZWRpdG9yIGNhbiBiZSBzZXQgYXMgZWRpdGFibGUKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSA9PSBudWxsKSB7Ci0JCQlpZiAoZGlzcGxheUhlYWRlckluZikKLQkJCQlyZXFIZWFkZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkKLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkaXNwbGF5SGVhZGVySW5mKQotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkKLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JCXNldFJlcXVlc3QocmVxdWVzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyKElDb250ZW50RmlsdGVyIGZpbHRlcikgewotCQlmaWx0ZXJzLnJlbW92ZShmaWx0ZXIpOwotCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZmlsdGVyKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWx0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZW50RmlsdGVyIGZpbHRlciA9IChJQ29udGVudEZpbHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQliID0gZmlsdGVyLmZpbHRlcihyZXF1ZXN0LCBmYWxzZSwgYik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIGZpbHRlcmluZyB3aXRoICIgKyBmaWx0ZXIuZ2V0SWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldFJlcXVlc3RWaWV3ZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXF1ZXN0Vmlld2VycygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8Vmlld2VyPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxWaWV3ZXI+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmlld2VyLmlzUmVxdWVzdFZpZXdlcigpKQotCQkJCXRlbXAuYWRkKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldFJlc3BvbnNlVmlld2VycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2VWaWV3ZXJzKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJTGlzdDxWaWV3ZXI+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFZpZXdlcj4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2aWV3ZXIuaXNSZXNwb25zZVZpZXdlcigpKQotCQkJCXRlbXAuYWRkKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlcXVlc3RWaWV3ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5lcXVhbHMocmVxdWVzdFZpZXdlcikpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBjYWxsIHNldCByZXF1ZXN0IHRvIHNhdmUgYW5kIHJlc2V0IHRoZSByZXF1ZXN0Ci0JCXNldFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJlcVZpZXdlci5kaXNwb3NlKCk7Ci0JCQotCQlyZXF1ZXN0Vmlld2VyID0gdmlld2VyOwotCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQlyZXFWaWV3ZXIgPSB2aWV3ZXIuY3JlYXRlVmlld2VyKCk7Ci0JCWVsc2UKLQkJCXJlcVZpZXdlciA9IG51bGw7Ci0JCWlmIChyZXFWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlcVZpZXdlci5pbml0KHJlcUNvbXApOwotCQkvL3JlcVZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWIgPSBmaWx0ZXIocmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQkJLy8gc2V0IHRoZSBlZGl0b3IgdG8gZWRpdGFibGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gc2VudCBhbmQgdGhlCi0JCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZQotCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKSA9PSBudWxsKSB7Ci0JCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJlcVZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXFDb21wLmxheW91dCh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjc2V0UmVzcG9uc2VWaWV3ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZXF1YWxzKHJlc3BvbnNlVmlld2VyKSkKLQkJCXJldHVybjsKLQkJcmVzcFZpZXdlci5kaXNwb3NlKCk7Ci0JCQotCQlyZXNwb25zZVZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJcmVzcFZpZXdlciA9IHZpZXdlci5jcmVhdGVWaWV3ZXIoKTsKLQkJZWxzZQotCQkJcmVzcFZpZXdlciA9IG51bGw7Ci0JCWlmIChyZXNwVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZXNwVmlld2VyLmluaXQocmVzcENvbXApOwotCQkvL3Jlc3BWaWV3ZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJYnl0ZVtdIGIgPSBudWxsOwotCQlpZiAocmVxdWVzdCAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXNwVmlld2VyLnNldENvbnRlbnQoYik7Ci0JCXJlc3BDb21wLmxheW91dCh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldEN1cnJlbnRSZXF1ZXN0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFZpZXdlciBnZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIHJlcVZpZXdlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgSGVhZGVyVmlld2VyIGdldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCkgewotCQlyZXR1cm4gcmVxSGVhZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jyb3dzZXJWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdhMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotLyoqCi0gKiBBIGJyb3dzZXIgdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBDUiA9ICdccic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIExGID0gJ1xuJzsKLQotCXByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExpc3RlbmVyKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7Ci0JCQlicm93c2VyLnNldFRleHQoTWVzc2FnZXMuaHRtbFZpZXdJbnZhbGlkKTsKLQkJfSBlbHNlIHsKLQkJCWIgPSBNb25pdG9yVUlQbHVnaW4udW56aXAoYik7Ci0JCQkKLQkJCWludCB0cmltRnJvbnQgPSAwOwotCQkJaW50IHRyaW1CYWNrID0gMDsKLQkJCWludCBsZW4gPSBiLmxlbmd0aCAtIDE7Ci0JCQl3aGlsZSAodHJpbUZyb250IDwgYi5sZW5ndGggJiYgKGJbdHJpbUZyb250XSA9PSBDUiB8fCBiW3RyaW1Gcm9udF0gPT0gTEYpKQotCQkJCXRyaW1Gcm9udCsrOwotCQkJd2hpbGUgKHRyaW1CYWNrIDwgYi5sZW5ndGggJiYgYi5sZW5ndGggPiAwICYmIChiW2xlbiAtIHRyaW1CYWNrXSA9PSBDUiB8fCBiW2xlbiAtIHRyaW1CYWNrXSA9PSBMRikpCi0JCQkJdHJpbUJhY2srKzsKLQkJCQotCQkJaWYgKHRyaW1Gcm9udCArIHRyaW1CYWNrID4gMCkgewotCQkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IGIubGVuZ3RoKSB7Ci0JCQkJCWIgPSBuZXcgYnl0ZVswXTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlW10gdGVtcCA9IGI7Ci0JCQkJCWIgPSBuZXcgYnl0ZVt0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrIC0gdHJpbUZyb250XTsKLQkJCQkJZm9yIChpbnQgaSA9IHRyaW1Gcm9udDsgaSA8IHRlbXAubGVuZ3RoIC0gdHJpbUJhY2s7IGkrKykgewotCQkJCQkJYltpIC0gdHJpbUZyb250XSA9IHRlbXBbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicm93c2VyLnNldFRleHQobmV3IFN0cmluZyhiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJYnJvd3NlciA9IG51bGw7Ci0JCWNvbnRlbnQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnl0ZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODJlN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEEgYmFzaWMgYnl0ZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCeXRlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQl0ZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRFZGl0YWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBieXRlWzBdOwotCQkKLQkJU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChjb250ZW50LmVxdWFscygiIikpCi0JCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JCQotCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50Ci0JCS8vIGdldEJ5dGVzKCkgcmVtb3ZlcyB0aGUgbmV3bGluZQotCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicgfTsKLQkJYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IGNvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbY29udGVudEJ5dGVzLmxlbmd0aCArIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGNvbnRlbnRCeXRlcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgY29udGVudEJ5dGVzLmxlbmd0aCwgMik7Ci0JCXJldHVybiByZXRCeXRlczsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCVN0cmluZyBvdXQgPSAiIjsKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKLQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJfQotCQkKLQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCWludCBscyA9IGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCWlmIChvdXQubGVuZ3RoKCkgPiBscykgewotCQkJd2hpbGUgKG91dC5zdWJzdHJpbmcoMCwgbHMpLmluZGV4T2YobGluZVNlcGFyYXRvcikgPj0gMCkKLQkJCQlvdXQgPSBvdXQuc3Vic3RyaW5nKGxzLCBvdXQubGVuZ3RoKCkpOyAKLQkJfQotCQkKLQkJdGV4dC5zZXRUZXh0KG91dCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGV4dC5kaXNwb3NlKCk7Ci0JCXRleHQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRmNGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tLk1vbml0b3JTdGFja0xheW91dDsKLS8qKgotICogQW4gdHJhbnNwb3J0IChoZWFkZXIpIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEhlYWRlclZpZXdlciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUhlYWRlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgaGVhZGVyQ29tcDsKLQlwcm90ZWN0ZWQgTW9uaXRvclN0YWNrTGF5b3V0IGxheW91dDsKLQotCXByb3RlY3RlZCBMYWJlbCBoZWFkZXJMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBoZWFkZXJUZXh0OwotCXByb3RlY3RlZCBSZXF1ZXN0IHJyOwotCXByb3RlY3RlZCBieXRlIG1zZzsKLQotCXByb3RlY3RlZCBib29sZWFuIGhpZGRlbjsKLQotCS8qKgotCSAqIFJlcXVlc3QgaGVhZGVyIGNvbnN0YW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBSRVFVRVNUX0hFQURFUiA9IDA7Ci0JCi0JLyoqCi0JICogUmVzcG9uc2UgaGVhZGVyIGNvbnN0YW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBSRVNQT05TRV9IRUFERVIgPSAxOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGhlYWRlciB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIEhlYWRlclZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBieXRlIG1lc3NhZ2UpIHsKLQkJZGlzcGxheUhlYWRlciA9IHRydWU7Ci0JCWhpZGRlbiA9IGZhbHNlOwotCQkKLQkJaGVhZGVyQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBNb25pdG9yU3RhY2tMYXlvdXQoKTsKLQkJaGVhZGVyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWhlYWRlclRleHQgPSBuZXcgVGV4dChoZWFkZXJDb21wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGhlYWRlckNvbXAuZ2V0RGlzcGxheSgpOwotCQloZWFkZXJUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWhlYWRlclRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJaGVhZGVyVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhlYWRlclRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7Ci0JCQotCQloZWFkZXJMYWJlbCA9IG5ldyBMYWJlbChoZWFkZXJDb21wLCBTV1QuTk9ORSk7Ci0JCQotCQlsYXlvdXQudG9wQ29udHJvbCA9IGhlYWRlclRleHQ7Ci0JCQotCQlyciA9IG51bGw7Ci0JCW1zZyA9IG1lc3NhZ2U7Ci0KLQkJc2V0RGlzcGxheUhlYWRlcihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0UmVzcG9uc2UoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJyID0gcmVxdWVzdDsKLQkJaWYgKCFoaWRkZW4pCi0JCQlnZXRWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5SGVhZGVyKGJvb2xlYW4gYikgewotCQlpZiAoZGlzcGxheUhlYWRlciAhPSBiKSB7Ci0JCQlkaXNwbGF5SGVhZGVyID0gYjsKLQkJCQotCQkJaWYgKGRpc3BsYXlIZWFkZXIpCi0JCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBoZWFkZXJUZXh0OwotCQkJZWxzZQotCQkJCWxheW91dC50b3BDb250cm9sID0gaGVhZGVyTGFiZWw7Ci0JCQkKLQkJCWhlYWRlckNvbXAubGF5b3V0KHRydWUpOwotCQkJZ2V0VmlldygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXcoKSB7Ci0JCVN0cmluZyBvdXQgPSAiIjsKLQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCWlmIChtc2cgPT0gUkVRVUVTVF9IRUFERVIpIHsKLQkJCQlieXRlW10gYiA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5UUkFOU1BPUlQpOwotCQkJCWlmIChiICE9IG51bGwpCi0JCQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJCX0gZWxzZSBpZiAobXNnID09IFJFU1BPTlNFX0hFQURFUikgewotCQkJCWJ5dGVbXSBiID0gcnIuZ2V0UmVzcG9uc2UoUmVxdWVzdC5UUkFOU1BPUlQpOwotCQkJCWlmIChiICE9IG51bGwpCi0JCQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRpc3BsYXlIZWFkZXIpCi0JCQloZWFkZXJUZXh0LnNldFRleHQob3V0KTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkJCWludCBpbmRleCA9IG91dC5pbmRleE9mKGxpbmVTZXBhcmF0b3IpOwotCQkJaWYgKGluZGV4ID4gMCkKLQkJCQloZWFkZXJMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmhlYWRlckxhYmVsLCBvdXQuc3Vic3RyaW5nKDAsIGluZGV4KSkpOwotCQkJZWxzZSAKLQkJCQloZWFkZXJMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmhlYWRlckxhYmVsLCBvdXQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQloZWFkZXJDb21wLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgaGVhZGVyIGNhbiBiZSBlZGl0ZWQuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlIElmIHRydWUgdGhlIGhlYWRlciBjYW4gYmUgZWRpdGVkLCBvdGhlcndpc2UgdGhlIGhlYWRlciBjYW5ub3QgYmUgZWRpdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaGVhZGVyVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb250ZW50IGZyb20gdGhlIGhlYWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb250ZW50IGZyb20gdGhlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7Ci0JCWlmIChoZWFkZXJUZXh0ID09IG51bGwgfHwgaGVhZGVyVGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBoZWFkZXIgPSBoZWFkZXJUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCS8vIE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGZvbGxvd2luZyA0IGJ5dGVzIGVuZCB0aGUgaGVhZGVyLiBUaGUgZ2V0Qnl0ZXMoKQotCQkvLyBtZXRob2QgcmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicsICdcMDE1JywgJ1wwMTInIH07Ci0JCWJ5dGVbXSBoZWFkZXJCeXRlcyA9IGhlYWRlci5nZXRCeXRlcygpOwotCQlieXRlW10gcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtoZWFkZXJCeXRlcy5sZW5ndGggKyA0XTsKLQkJU3lzdGVtLmFycmF5Y29weShoZWFkZXJCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGhlYWRlckJ5dGVzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodHdvTmV3bGluZXMsIDAsIHJldEJ5dGVzLCBoZWFkZXJCeXRlcy5sZW5ndGgsIDQpOwotCQlyZXR1cm4gcmV0Qnl0ZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1hZ2VWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1hZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkNGRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLS8qKgotICogQW4gaW1hZ2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAnXHInOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBMRiA9ICdcbic7Ci0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsOwotCXByb3RlY3RlZCBMYWJlbCBtZXNzYWdlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2Nyb2xsID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHNjcm9sbCwgU1dULk5PTkUpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5pbWFnZVZpZXdJbnZhbGlkKTsKLQkJbWVzc2FnZUxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRTaXplKG1lc3NhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJc2Nyb2xsLnNldENvbnRlbnQobWVzc2FnZUxhYmVsKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCWNvbnRlbnQgPSBiOwotCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApIHsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRJbWFnZShudWxsKTsKLQkJfSBlbHNlIHsKLQkJCWIgPSBNb25pdG9yVUlQbHVnaW4udW56aXAoYik7Ci0JCQkKLQkJCWludCB0cmltRnJvbnQgPSAwOwotCQkJaW50IHRyaW1CYWNrID0gMDsKLQkJCWludCBsZW4gPSBiLmxlbmd0aCAtIDE7Ci0JCQl3aGlsZSAodHJpbUZyb250IDwgYi5sZW5ndGggJiYgYlt0cmltRnJvbnRdID09IENSIHx8IGJbdHJpbUZyb250XSA9PSBMRikKLQkJCQl0cmltRnJvbnQrKzsKLQkJCXdoaWxlICh0cmltQmFjayA8IGIubGVuZ3RoICYmIGJbbGVuIC0gdHJpbUJhY2tdID09IENSIHx8IGJbbGVuIC0gdHJpbUJhY2tdID09IExGKQotCQkJCXRyaW1CYWNrKys7Ci0JCQkKLQkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IDApIHsKLQkJCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiBiLmxlbmd0aCkgewotCQkJCQliID0gbmV3IGJ5dGVbMF07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnl0ZVtdIHRlbXAgPSBiOwotCQkJCQliID0gbmV3IGJ5dGVbdGVtcC5sZW5ndGggLSB0cmltQmFjayAtIHRyaW1Gcm9udF07Ci0JCQkJCWZvciAoaW50IGkgPSB0cmltRnJvbnQ7IGkgPCB0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrOyBpKyspIHsKLQkJCQkJCWJbaSAtIHRyaW1Gcm9udF0gPSB0ZW1wW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCUltYWdlRGF0YSBpbWdEID0gbmV3IEltYWdlRGF0YShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotCQkJCUltYWdlIGltZyA9IG5ldyBJbWFnZShudWxsLCBpbWdEKTsKLQkJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UoaW1nKTsKLQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW1hZ2VWaWV3SW52YWxpZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW1lc3NhZ2VMYWJlbC5zZXRTaXplKG1lc3NhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzY3JvbGwuZGlzcG9zZSgpOwotCQlzY3JvbGwgPSBudWxsOwotCQltZXNzYWdlTGFiZWwgPSBudWxsOwotCQljb250ZW50ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL1hNTFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9YTUxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyOWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL1hNTFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgMjAwNS0xMS0yNSBBcnRodXIgUnltYW4sIHJ5bWFuQGNhLmlibS5jb20KLSAqICAgICAtIGZpeGVkIGJ1ZyAxMTgxMDI6IHNldCB4bWxUYWdNaXNzaW5nIGNvcnJlY3RseSBlYWNoIHRpbWUgc2V0Q29udGVudCgpIGlzIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0gCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLS8qKgotICogWE1MIFZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgewotCXByb3RlY3RlZCBDb21wb3NpdGUgdmlld2VyQ29tcDsKLQlwcm90ZWN0ZWQgU3RhY2tMYXlvdXQgbGF5b3V0OwotCXByb3RlY3RlZCBUZXh0IG1lc3NhZ2VUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBtZXNzYWdlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxUYWdNaXNzaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RW5jb2RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaXNzaW5nRW5jb2RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsRW5jb2Rpbmc7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCWNvbnRlbnQgPSBiOwotCQlTdHJpbmcgb3V0ID0gIiI7CQotCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOwotCQkJb3V0ID0gTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpOwotCQl9Ci0JCQotCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkJaW50IGxzID0gbGluZVNlcGFyYXRvci5sZW5ndGgoKTsKLQkJaWYgKG91dC5sZW5ndGgoKSA+IGxzKSB7Ci0JCQl3aGlsZSAob3V0LnN1YnN0cmluZygwLCBscykuaW5kZXhPZihsaW5lU2VwYXJhdG9yKSA+PSAwKQotCQkJb3V0ID0gb3V0LnN1YnN0cmluZyhscywgb3V0Lmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJU3RyaW5nIG91dF90ZW1wID0gb3V0LnRvTG93ZXJDYXNlKCk7Ci0JCXhtbFRhZ01pc3NpbmcgPSAhb3V0X3RlbXAuc3RhcnRzV2l0aCgiPD94bWwiKTsKLQkJCi0JCWlmIChvdXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZmluYWxNc2cgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlieXRlW10gYjEgPSBjcmVhdGVEb2N1bWVudChvdXQpOwotCQkJCWZpbmFsTXNnID0gbmV3IFN0cmluZyhiMSkudHJpbSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXNlOiBlcnJvciBwYXJzaW5nCi0JCQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBtZXNzYWdlTGFiZWw7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMueG1sVmlld0ludmFsaWQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh4bWxUYWdNaXNzaW5nICYmIGZpbmFsTXNnLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+IikpIHsKLQkJCQlpbnQgeCA9IGZpbmFsTXNnLmluZGV4T2YoIlxuIikgKyAxOwotCQkJCVN0cmluZyBNc2cgPSBmaW5hbE1zZy5zdWJzdHJpbmcoeCk7Ci0JCQkJZmluYWxNc2cgPSBNc2c7Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7Ci0JCQl9IGVsc2UgaWYgKHNldEVuY29kaW5nKSB7Ci0JCQkJLy8gY2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgZW5jb2RpbmcKLQkJCQlpbnQgYmVnaW4gPSBmaW5hbE1zZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0Zi04Iik7IC8vIGxvY2F0aW9uIG9mIG9wZW5pbmcgIgotCQkJCWlmIChiZWdpbiA+PSAwKSB7Ci0JCQkJCWludCBsYXN0ID0gYmVnaW4gKyA1OyAgLy8gbG9jYXRpb24gb2YgY2xvc2luZyAiCi0JCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOwotCQkJCQlTdHJpbmcgc2Vjb25kX2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcobGFzdCk7Ci0JCQkJCWZpbmFsTXNnID0gZmlyc3RfaGFsZiArIG9yaWdpbmFsRW5jb2RpbmcgKyBzZWNvbmRfaGFsZjsKLQkJCQl9Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7Ci0JCQl9IGVsc2UgaWYgKG1pc3NpbmdFbmNvZGluZykgewotCQkJCS8vIHJlbW92ZSBlbmNvZGluZyBjb21wbGV0ZWx5Ci0JCQkJaW50IGJlZ2luID0gZmluYWxNc2cudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbmNvZGluZz1cInV0Zi04XCIiKTsgLy9sb2NhdGlvbiBvZiBvcGVuaW5nICIKLQkJCQlpbnQgbGFzdCA9IGJlZ2luICsgMTY7ICAvL2xvY2F0aW9uIG9mIGNsb3NpbmcgIgotCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOwotCQkJCVN0cmluZyBzZWNvbmRfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZyhsYXN0KTsKLQkJCQlmaW5hbE1zZyA9IGZpcnN0X2hhbGYgKyBzZWNvbmRfaGFsZjsKLQkJCQkKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsJCi0JCQl9IGVsc2UKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsKLQkJfSBlbHNlCi0JCQltZXNzYWdlVGV4dC5zZXRUZXh0KG91dCk7Ci0JCQotCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWxheW91dC50b3BDb250cm9sID0gbWVzc2FnZVRleHQ7Ci0JCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdlckNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXZpZXdlckNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQltZXNzYWdlVGV4dCA9IG5ldyBUZXh0KHZpZXdlckNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyQ29tcC5nZXREaXNwbGF5KCk7Ci0JCW1lc3NhZ2VUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWVzc2FnZVRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7Ci0JCQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwodmlld2VyQ29tcCwgU1dULk5PTkUpOwotCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlsYXlvdXQudG9wQ29udHJvbCA9IG1lc3NhZ2VUZXh0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAI2NyZWF0ZURvY3VtZW50KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNyZWF0ZURvY3VtZW50KFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7CQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJdHJ5IHsKLQkJCQlmYWN0b3J5LnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkKLQkJCWlmICh4bWxUYWdNaXNzaW5nKSB7Ci0JCQkJc3RyID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKyBzdHI7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBzdHJfdGVtcCA9IHN0ci50b0xvd2VyQ2FzZSgpOwotCQkJCQotCQkJCS8vIGlmIGVuY29kaW5nIHByZXNlbnQsIHRoZW4gc2F2ZSBvcmlnaW5hbCBlbmNvZGluZyBhbmQgY2hhbmdlIHRvIFVURi04Ci0JCQkJaW50IGluZCA9IHN0cl90ZW1wLmluZGV4T2YoImVuY29kaW5nPSIpOwotCQkJCWlmIChpbmQgPj0gMCkgewotCQkJCQlTdHJpbmcgdGVtcDEgPSBzdHIuc3Vic3RyaW5nKGluZCk7Ci0JCQkJCWludCBiZWdpbkluZGV4ID0gdGVtcDEuaW5kZXhPZigiXCIiKSArIDE7Ci0JCQkJCVN0cmluZyB0ZW1wMiA9IHRlbXAxLnN1YnN0cmluZyhiZWdpbkluZGV4KTsKLQkJCQkJaW50IGVuZEluZGV4ID0gdGVtcDIuaW5kZXhPZigiXCIiKTsKLQkJCQkJb3JpZ2luYWxFbmNvZGluZyA9IHRlbXAyLnN1YnN0cmluZygwLCBlbmRJbmRleCk7Ci0JCQkJCWlmICghInV0Zi04Ii5lcXVhbHMob3JpZ2luYWxFbmNvZGluZykpCi0JCQkJCQlzZXRFbmNvZGluZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbmQgPCAwKSB7IC8vaWYgbm8gZW5jb2RpbmcgYXQgYWxsLHRoZW4gbm8gY2hhbmdlcyB0byBiZSBtYWRlCi0JCQkJCXNldEVuY29kaW5nID0gZmFsc2U7Ci0JCQkJCW1pc3NpbmdFbmNvZGluZyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnl0ZVtdIHBhcnNlQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFyc2VBcnJheSkpKTsKLQkJCXJldHVybiBnZXRDb250ZW50cyhkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgWE1MIik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldENvbnRlbnRzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwotCQlTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJdGYuc2V0QXR0cmlidXRlKCJpbmRlbnQtbnVtYmVyIiwgbmV3IEludGVnZXIoMikpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vIGlnbm9yZSAtIGZhaWxzIG9uIEpESyAxLjQKLQkJCX0KLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl2aWV3ZXJDb21wLmRpc3Bvc2UoKTsKLQkJdmlld2VyQ29tcCA9IG51bGw7Ci0JCWNvbnRlbnQgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ODU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9VENQL0lQIE1vbml0b3IKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1leHRlbnNpb25Qb2ludFZpZXdlcnM9Vmlld2VycwotCi12aWV3VGl0bGU9VENQL0lQIE1vbml0b3IKLWFjdGlvblJlc2VuZD1SZXNlbmQgcmVxdWVzdAotYWN0aW9uTW9kaWZ5PU1vZGlmeSByZXF1ZXN0Ci1hY3Rpb25Nb2RpZnlSZXNlbmQ9U2VuZCBNb2RpZmllZCBSZXF1ZXN0Ci0KLWJ5dGVWaWV3PUJ5dGUKLWltYWdlVmlldz1JbWFnZQoteG1sVmlldz1YTUwKLWJyb3dzZXJWaWV3PVdlYiBCcm93c2VyCi0KLXByZWZlcmVuY2VUaXRsZT1UQ1AvSVAgTW9uaXRvcgotcHJlZmVyZW5jZUtleXdvcmRzPWRlYnVnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM2MTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVleHRlbnNpb25Qb2ludFZpZXdlcnMiIGlkPSJ2aWV3ZXJzIiBzY2hlbWE9InNjaGVtYS92aWV3ZXJzLmV4c2QiLz4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbFN0YXJ0dXAiPgotICA8c3RhcnR1cAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuU3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4gCi0gIDx2aWV3Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXciCi0gICAgbmFtZT0iJXZpZXdUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9uaXRvclZpZXciCi0gICAgaWNvbj0iaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYiPgotICA8L3ZpZXc+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiCi0gICAgbmFtZT0iJXByZWZlcmVuY2VUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQcmVmZXJlbmNlUGFnZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkudmlld2VycyI+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJ5dGVWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnl0ZVZpZXciLz4KLSAgPHZpZXdlcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmltYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkltYWdlVmlld2VyIgotICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKLSAgICBsYWJlbD0iJWltYWdlVmlldyIvPgotICA8dmlld2VyCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMueG1sIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLlhNTFZpZXdlciIKLSAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCi0gICAgbGFiZWw9IiV4bWxWaWV3Ii8+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5icm93c2VyIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJyb3dzZXJWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnJvd3NlclZpZXciLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICA8ZmFjdG9yeQotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5SZXF1ZXN0QWRhcHRlckZhY3RvcnkiCi0gICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0Ij4KLSAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+Ci0gIDwvZmFjdG9yeT4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkubW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvblJlc2VuZCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlJlc2VuZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5SZXNlbmRNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5IgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9kaWZ5TWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vZGlmeU1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0IgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5zZW5kbW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0iZmFsc2UiLz4gICAgCi0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5UmVzZW5kIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmIj4KLSAgICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzYzNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiBpZD0idmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHZpZXdlciBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnRlbnQuIChlLmcuIGEgdmlld2VyIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgZm9ybWF0KQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9zYW1wJmd0Oy4gVmlld2VycyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBbaXNzdWU6IHdoYXQgaXMgdGhpcyB1c2VkIGZvcj9dDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IHZpZXdlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnZpZXdlcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3ZpZXdlcg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmJ5dGV2aWV3ZXImcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5CeXRlQ29udGVudFZpZXdlciZxdW90Ow0KLSAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVxdWVzdHJlc3BvbnNlJnF1b3Q7DQotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JWJ5dGVWaWV3JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlciZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTZkNDlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkN2RlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0YzE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjYzFkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRmViIDIzIDIxOjExOjUyIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjMDM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5NDlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMWMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SFRUUCBTZXJ2ZXIgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLXJ1bnRpbWVUeXBlSHR0cExhYmVsPUhUVFAgU2VydmVyCi1ydW50aW1lVHlwZUh0dHBEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgcHJvamVjdHMgb24gYW4gSFRUUCBzZXJ2ZXIuCi0KLWh0dHBTZXJ2ZXJUeXBlPUhUVFAgU2VydmVyCi1odHRwU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIHByb2plY3RzIG9uIGFuIEhUVFAgc2VydmVyLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJjYmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0JICAgICAgIG5hbWU9IiVydW50aW1lVHlwZUh0dHBMYWJlbCIKLQkgICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZUh0dHBEZXNjcmlwdGlvbiIKLQkgICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIKLQkgICAgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotCSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFJ1bnRpbWUiPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJQSFAiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAJIHR5cGVzPSJ3c3Qud2ViIgotCSAgICAgICAJIHZlcnNpb25zPSIxLjAiLz4KLQkgICAgPC9ydW50aW1lVHlwZT4KLSAgCTwvZXh0ZW5zaW9uPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgbmFtZT0iJWh0dHBTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIlaHR0cFNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9InRydWUiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0YXJ0ZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0iZmFsc2UiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgCTwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lTG9jYXRvcnMiPgotICAgIDxydW50aW1lTG9jYXRvcgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZS5sb2NhdG9yIgotICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwUnVudGltZUxvY2F0b3IiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIi8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIKLSAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSJbMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMiPgotICAgIDxkZWZhdWx0LWZhY2V0cz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyI+Ci0gICAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC53ZWIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnNlcnZlciIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9IdHRwQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3NzY4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9IdHRwQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBIVFRQIHNlcnZlciBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgSHR0cENvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEh0dHBDb3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBIdHRwQ29yZVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgcnVudGltdCB0eXBlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShpZCwgdmFsdWUpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjgzZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLkh0dHBMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQkvKgotCSAqIEBzZWUgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSNnZXRMYXVuY2hhYmxlKElTZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VydmVyID09IG51bGwgfHwgbW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSHR0cFNlcnZlciBzZXJ2ZXIyID0gKEh0dHBTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLCBudWxsKTsKLQkJaWYgKHNlcnZlcjIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBzZXJ2ZXIyLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkpOwotCQkJCi0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgaW5zdGFuY2VvZiBXZWJSZXNvdXJjZSkgewotCQkJCVdlYlJlc291cmNlIHJlc291cmNlID0gKFdlYlJlc291cmNlKSBtb2R1bGVBcnRpZmFjdDsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQotCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCXVybCA9IG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyAiLyIgKyBwYXRoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgSHR0cExhdW5jaGFibGUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluIGxhdW5jaGFibGUgYWRhcHRlciIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmJiMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSHR0cFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIjsKLQotCXB1YmxpYyBIdHRwUnVudGltZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3NldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKCIiKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBSdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWVMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjU0NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUnVudGltZUxvY2F0b3IgZXh0ZW5kcyBSdW50aW1lTG9jYXRvckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHJ1bnRpbWVUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IEh0dHBSdW50aW1lLklEIH07Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JUnVudGltZUZhY3RvcnlEZWxlZ2F0ZSNnZXRLbm93blJ1bnRpbWVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JSdW50aW1lcyhJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlYXJjaEZvclJ1bnRpbWVzMihwYXRoLCBsaXN0ZW5lciwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzMihJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkKLQkJCQlmaWxlcyA9IGYubGlzdEZpbGVzKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWZpbGVzID0gRmlsZS5saXN0Um9vdHMoKTsKLQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQlpbnQgd29yayA9IDEwMCAvIHNpemU7Ci0JCQlpbnQgd29ya0xlZnQgPSAxMDAgLSAod29yayAqIHNpemUpOwotCQkJZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJCQlzZWFyY2hEaXIobGlzdGVuZXIsIGZpbGUsIDQsIG1vbml0b3IpOwotCQkJCW1vbml0b3Iud29ya2VkKHdvcmspOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQod29ya0xlZnQpOwotCQl9IGVsc2UKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaERpcihJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBGaWxlIGRpciwgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCJodGRvY3MiLmVxdWFscyhkaXIuZ2V0TmFtZSgpKSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gZ2V0UnVudGltZUZyb21EaXIoZGlyLmdldFBhcmVudEZpbGUoKSwgbW9uaXRvcik7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJbGlzdGVuZXIucnVudGltZUZvdW5kKHJ1bnRpbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChkZXB0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJc2VhcmNoRGlyKGxpc3RlbmVyLCBmaWxlLCBkZXB0aCAtIDEsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZVdvcmtpbmdDb3B5IGdldFJ1bnRpbWVGcm9tRGlyKEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChTdHJpbmcgcnQgOiBydW50aW1lVHlwZXMpIHsKLQkJCXRyeSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnQpOwotCQkJCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIGlkID0gYWJzb2x1dGVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnXycpLnJlcGxhY2UoJzonLCAnLScpOwotCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoaWQsIG1vbml0b3IpOwotCQkJCXJ1bnRpbWUuc2V0TmFtZShkaXIuZ2V0TmFtZSgpKTsKLQkJCQlydW50aW1lLnNldExvY2F0aW9uKG5ldyBQYXRoKGFic29sdXRlUGF0aCkuYXBwZW5kKCJodGRvY3MiKSk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG1vbml0b3IpOwotCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKQotCQkJCQlyZXR1cm4gcnVudGltZTsKLQkJCQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkZhbHNlIHJ1bnRpbWUgZm91bmQgYXQgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkJKyAiOiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHJ1bnRpbWUiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUxOTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotLyoqCi0gKiBHZW5lcmljIEhUVFAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgSHR0cFNlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VUkxfUFJFRklYID0gInVybFByZWZpeCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUE9SVCA9ICJwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19QVUJMSVNISU5HID0gImlzUHVibGlzaGluZyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuc2VydmVyIjsKLQotCS8qKgotCSAqIEh0dHBTZXJ2ZXIuCi0JICovCi0JcHVibGljIEh0dHBTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lRGVsZWdhdGUjc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0UG9ydCg4MCk7Ci0JCXNldFVSTFByZWZpeCgiIik7Ci0JCXNldFB1Ymxpc2hpbmcodHJ1ZSk7Ci0JfQotCi0JcHVibGljIEh0dHBSdW50aW1lIGdldEh0dHBSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKEh0dHBSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoSHR0cFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qcHVibGljIHZvaWQgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgYXJnMCwgSVByb2dyZXNzTW9uaXRvciBhcmcxKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRIdHRwUnVudGltZSgpICE9IG51bGwpIHsKLQkJCWlmICghZ2V0SHR0cFJ1bnRpbWUoKS5wdWJsaXNoVG9EaXJlY3RvcnkoKSkgewotCQkJCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXNldHRpbmciLCAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0QXR0cmlidXRlKCJhdXRvLXB1Ymxpc2gtc2V0dGluZyIsIDIpOwotCQkJCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXRpbWUiLCAxKTsKLQkJCX0KLQkJCS8vc2V0UHVibGlzaERpcmVjdG9yeShnZXRIdHRwUnVudGltZSgpLmdldFB1Ymxpc2hMb2NhdGlvbigpKTsKLQkJfQotCX0qLwotCi0JcHVibGljIGJvb2xlYW4gZG9udFB1Ymxpc2goKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImF1dG8tcHVibGlzaC1zZXR0aW5nIiwgIjIiKS5lcXVhbHMoIjEiKTsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJvb3QoU3RyaW5nIGRvY1Jvb3QpIHsKLQkvLyBzZXRBdHRyaWJ1dGUoSHR0cFNlcnZlci5ET0NVTUVOVF9ST09ULCBkb2NSb290KTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50Um9vdCgpIHsKLQkvLyByZXR1cm4gZ2V0QXR0cmlidXRlKEh0dHBTZXJ2ZXIuRE9DVU1FTlRfUk9PVCwgIiIpOwotCS8vIH0KLQotCS8vIHB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2goKSB7Ci0JLy8gcmV0dXJuIGdldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBVQkxJU0gsIHRydWUpOwotCS8vIH0KLQotCS8vIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2goYm9vbGVhbiBwdWJsaXNoKSB7Ci0JLy8gc2V0QXR0cmlidXRlKEh0dHBTZXJ2ZXIuUFVCTElTSCwgcHVibGlzaCk7Ci0JLy8gfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBob3N0IHRvIHJldHVybiBJUHY2IGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMsIGUuZy4KLQkgKiAiWzRmZmU6ZmYyZjoxMDE6MjE6MjMwOjZlZmY6ZmUwNDpkOWZlXSIuIElmIHRoZSBob3N0IGlzIGp1c3QgYSBob3N0IG5hbWUKLQkgKiBvciBJUHY0IGFkZHJlc3MsIHRoZW4gaXQgaXMgcmV0dXJuZWQgYXMgaXMuCi0JICogCi0JICogQHBhcmFtIGhvc3QgdGhlIGhvc3QsIGFuIElQIGFkZHJlc3Mgb3IgaG9zdCBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VVJMSG9zdChTdHJpbmcgaG9zdCkgewotCQkvLyB1c2UgIjoiIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGFuIElQdjYgYWRkcmVzcyAKLQkJcmV0dXJuIChob3N0ICE9IG51bGwgJiYgaG9zdC5pbmRleE9mKCI6IikgPj0gMCkgPyAiWyIgKyBob3N0ICsgIl0iIDogaG9zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgVVJMIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSByb290IFVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovLyIgKyBnZXRVUkxIb3N0KGdldFNlcnZlcigpLmdldEhvc3QoKSk7Ci0JCQkKLQkJCWlmIChiYXNlLmVxdWFscygiIikpCi0JCQkJYmFzZSA9ICJodHRwOi8vIiArIGdldFVSTEhvc3QoZ2V0U2VydmVyKCkuZ2V0SG9zdCgpKTsKLQkJCQotCQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCWlmIChwb3J0ID09IDgwKQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICIvIik7Ci0JCQllbHNlCi0JCQkJdXJsID0gbmV3IFVSTChiYXNlICsgIjoiICsgcG9ydCArICIvIik7Ci0JCQkKLQkJCVN0cmluZyBwcmVmaXggPSBnZXRVUkxQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwcmVmaXggKyAiLyIpOwotCQkJCi0JCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQlyZXR1cm4gbmV3IFVSTCh1cmwsIHN0YXRpY1dlYi5nZXRDb250ZXh0Um9vdCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgcm9vdCBVUkwiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSByb290IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciwgYW5kIGZhbHNlCi0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGQgbW9kdWxlcwotCSAqIEBwYXJhbSByZW1vdmUgbW9kdWxlcwotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNhbk1vZGlmeU1vZHVsZXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCWludCBwb3J0ID0gZ2V0UG9ydCgpOwotCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSB7IG5ldyBTZXJ2ZXJQb3J0KCJodHRwIiwgTWVzc2FnZXMuaHR0cFBvcnQsIHBvcnQsICJodHRwIikgfTsKLQkJcmV0dXJuIHBvcnRzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1BPUlQsIDgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXNldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1BPUlQsIHBvcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXNldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1VSTF9QUkVGSVgsIHByZWZpeCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkxQcmVmaXgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSHR0cFNlcnZlci5QUk9QRVJUWV9VUkxfUFJFRklYLCAiIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0lTX1BVQkxJU0hJTkcsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoaW5nKGJvb2xlYW4gc2hvdWxkUHVibGlzaCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfSVNfUFVCTElTSElORywgc2hvdWxkUHVibGlzaCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoU3RyaW5nIGhvc3QsIFN0cmluZyBzZXJ2ZXJOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKEh0dHBSdW50aW1lLklEKTsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZUNvcHkgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKEh0dHBSdW50aW1lLklELCBtb25pdG9yKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShJRCk7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbW9uaXRvcik7Ci0JCQl3b3JraW5nQ29weS5zZXROYW1lKHNlcnZlck5hbWUpOwotCQkJd29ya2luZ0NvcHkuc2V0SG9zdChob3N0KTsKLQkJCQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5LnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBzZXJ2ZXIiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRIdHRwU2VydmVyKFN0cmluZyBpZCkgewotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlmb3IgKElTZXJ2ZXIgc2VydmVyIDogc2VydmVycykgewotCQkJaWYgKHNlcnZlci5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKnB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXJlY3RvcnkoU3RyaW5nIHB1YkRpcikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfUFVCX0RJUiwgcHViRGlyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXJlY3RvcnkoKSB7Ci0JCWlmIChnZXRIdHRwUnVudGltZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1BVQl9ESVIsIGdldEh0dHBSdW50aW1lKCkuZ2V0UHVibGlzaExvY2F0aW9uKCkpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1BVQl9ESVIsICIiKTsKLQl9Ki8KLQotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJhc2VVUkwoU3RyaW5nIGlkLCBTdHJpbmcgYmFzZVVSTCkgewotCSAqIHVwZGF0ZUJhc2VVUkwoY2hlY2tGb3JIdHRwU2VydmVyKGlkKSwgYmFzZVVSTCk7IH0KLQkgKi8KLQotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJhc2VVUkwoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBiYXNlVVJMKSB7IGlmCi0JICogKHNlcnZlciA9PSBudWxsKSByZXR1cm47Ci0JICogCi0JICogSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICogCi0JICogSHR0cFNlcnZlciBhcyA9IChIdHRwU2VydmVyKSB3b3JraW5nQ29weS5nZXRBZGFwdGVyKEh0dHBTZXJ2ZXIuY2xhc3MpOyBpZgotCSAqIChhcyA9PSBudWxsKSBhcyA9IChIdHRwU2VydmVyKSB3b3JraW5nQ29weS5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLAotCSAqIG51bGwpOwotCSAqIAotCSAqIFN0cmluZyBjdXJyZW50VVJMID0gYXMuZ2V0QmFzZVVSTCgpOwotCSAqIAotCSAqIGlmIChjdXJyZW50VVJMLmVxdWFscyhiYXNlVVJMKSkgcmV0dXJuOyBhcy5zZXRCYXNlVVJMKGJhc2VVUkwpOyB0cnkgewotCSAqIGFzLnNhdmVDb25maWd1cmF0aW9uKG51bGwpOyB3b3JraW5nQ29weS5zYXZlKHRydWUsIG51bGwpOyB9IGNhdGNoCi0JICogKENvcmVFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9IH0KLQkgKi8KLQotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJIdHRwU2VydmVyIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlckJlaGF2aW91ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY3Y2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsOwotLyoqCi0gKiBHZW5lcmljIEh0dHAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgSHR0cFNlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCi0JLyoqCi0JICogSHR0cFNlcnZlci4KLQkgKi8KLQlwdWJsaWMgSHR0cFNlcnZlckJlaGF2aW91cigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEh0dHBSdW50aW1lIGdldEh0dHBSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKEh0dHBSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoSHR0cFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBIdHRwU2VydmVyIGdldEh0dHBTZXJ2ZXIoKSB7Ci0JCXJldHVybiAoSHR0cFNlcnZlcikgZ2V0U2VydmVyKCkuZ2V0QWRhcHRlcihIdHRwU2VydmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCXNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGVUcmVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRIdHRwU2VydmVyKCkuaXNQdWJsaXNoaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZVRyZWVbbW9kdWxlVHJlZS5sZW5ndGggLSAxXTsgCi0JCUlTdGF0aWNXZWIgc3cgPSAoSVN0YXRpY1dlYikgbW9kdWxlLmxvYWRBZGFwdGVyKElTdGF0aWNXZWIuY2xhc3MsIG1vbml0b3IpOwotCQlpZiAoc3cgIT0gbnVsbCkKLQkJCWNvbnRleHRSb290ID0gc3cuZ2V0Q29udGV4dFJvb3QoKTsKLQkJZWxzZQotCQkJY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQkKLQkJSVBhdGggdG8gPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGNvbnRleHRSb290ICE9IG51bGwgJiYgIWNvbnRleHRSb290LmVxdWFscygiIikpCi0JCQl0byA9IHRvLmFwcGVuZChjb250ZXh0Um9vdCk7Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBnZXRSZXNvdXJjZXMobW9kdWxlVHJlZSk7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzLCB0bywgbW9uaXRvcik7Ci0JCXRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlVHJlZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRocm93IGEgQ29yZUV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9mCi0JICogZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBMaXN0IGNvbnRhaW5pbmcgZXJyb3IgYW5kIHdhcm5pbmcgSVN0YXR1cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHN0YXR1cy5sZW5ndGggPT0gMSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yUHVibGlzaDsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIHN0YXR1cywgbWVzc2FnZSwgbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbmx5IHNodXRzIGRvd24gYW5kIHRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSHR0cFNlcnZlciI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFlMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuTW9kaWZ5TW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb2RpZnlQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeVByZWZpeFVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb2RpZnlQdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEh0dHBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjBiYmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1hY3Rpb25Nb2RpZnlQb3J0PXNldCBwb3J0IG51bWJlcgotYWN0aW9uTW9kaWZ5UHJlZml4VVJMPXNldCBVUkwgcHJlZml4Ci1hY3Rpb25Nb2RpZnlQdWJsaXNoaW5nPXNldCBwdWJsaXNoaW5nIGVuYWJsZW1lbnQKLWVycm9yUHVibGlzaD1FcnJvciBkdXJpbmcgcHVibGlzaAotCi1odHRwUG9ydD1IVFRQIFBvcnQKLWNhbk1vZGlmeU1vZHVsZXM9V2ViIG1vZHVsZXMgY2FuIGJlIG1vZGlmaWVkLgotCi1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNjBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3MgPSA1NjsgLy8gdG90YWw6IDE2IHNlY29uZHMgKyBjb25uZWN0aW9uIHRpbWUKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0KLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCi0JcHJpdmF0ZSBIdHRwU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIG1heFBpbmdzCi0JICogQHBhcmFtIGJlaGF2aW91cgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBpbnQgbWF4UGluZ3MsCi0JCQlIdHRwU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMubWF4UGluZ3MgPSBtYXhQaW5nczsKLQkJdGhpcy5iZWhhdmlvdXIgPSBiZWhhdmlvdXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogUGluZyB0aGUgc2VydmVyIHVudGlsIGl0IGlzIHN0YXJ0ZWQuIFRoZW4gc2V0IHRoZSBzZXJ2ZXIgc3RhdGUgdG8KLQkgKiBTVEFURV9TVEFSVEVELgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBpbmcoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoUElOR19ERUxBWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQl3aGlsZSAoIXN0b3ApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvdW50ID09IG1heFBpbmdzKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBjb3VsZCBub3Qgc3RvcCBzZXJ2ZXIiKTsKLQkJCQkJfQotCQkJCQlzdG9wID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNvdW50Kys7Ci0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nIik7Ci0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uID0gcGluZ1VybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm4pLmdldFJlc3BvbnNlQ29kZSgpOwotCi0JCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7Ci0JCXN0b3AgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhhNjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlIGN1cnJlbnQKLQkgKiBwcm9ncmVzcyBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGludAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZSBjdXJyZW50Ci0JICogcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLAotCQkJaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc3Y2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVIgPSA0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiQ09ORklHICAgIiwgIldBUk5JTkcgICIsCi0JCSJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJSHR0cENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCi0JCWlmICghSHR0cENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSHR0cENvcmVQbHVnaW4uUExVR0lOX0lEKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCS8vIFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFNlcnZlckNvcmUuUExVR0lOX0lEICsgIi8iICsgInJlc291cmNlcyIpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2MDIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVBvcnRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBwb3J0OwotCXByb3RlY3RlZCBpbnQgb2xkUG9ydDsKLQotCS8qKgotCSAqIE1vZGlmeVBvcnRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBuZXcgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5UG9ydENvbW1hbmQoSHR0cFNlcnZlciBzZXJ2ZXIsIGludCBwb3J0KSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuYWN0aW9uTW9kaWZ5UG9ydCk7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIG9sZCBwb3J0IG51bWJlcgotCQlTZXJ2ZXJQb3J0IHRlbXAgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMoKVswXTsKLQkJb2xkUG9ydCA9IHRlbXAuZ2V0UG9ydCgpOwotCQkKLQkJLy8gbWFrZSB0aGUgY2hhbmdlCi0JCXNlcnZlci5zZXRQb3J0KHBvcnQpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFBvcnQob2xkUG9ydCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiMjc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVB1Ymxpc2hpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgcHVibGlzaGluZyBzdGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVB1Ymxpc2hpbmdDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUHVibGlzaDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRTaG91bGRQdWJsaXNoOwotCi0JLyoqCi0JICogTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBzaG91bGRQdWJsaXNoIAotCSAqLwotCXB1YmxpYyBNb2RpZnlQdWJsaXNoaW5nQ29tbWFuZChIdHRwU2VydmVyIHNlcnZlciwgYm9vbGVhbiBzaG91bGRQdWJsaXNoKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuYWN0aW9uTW9kaWZ5UHVibGlzaGluZyk7Ci0JCXRoaXMuc2hvdWxkUHVibGlzaCA9IHNob3VsZFB1Ymxpc2g7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTaG91bGRQdWJsaXNoID0gc2VydmVyLmlzUHVibGlzaGluZygpOwotCQkKLQkJLy8gbWFrZSB0aGUgY2hhbmdlCi0JCXNlcnZlci5zZXRQdWJsaXNoaW5nKHNob3VsZFB1Ymxpc2gpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFB1Ymxpc2hpbmcob2xkU2hvdWxkUHVibGlzaCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5VVJMUHJlZml4Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlVUkxQcmVmaXhDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDc1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlVUkxQcmVmaXhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCXByb3RlY3RlZCBTdHJpbmcgb2xkUHJlZml4OwotCi0JLyoqCi0JICogTW9kaWZ5VVJMUHJlZml4Q29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgSFRUUCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHByZWZpeCBhIG5ldyBwcmVmaXgKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZChIdHRwU2VydmVyIHNlcnZlciwgU3RyaW5nIHByZWZpeCkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLmFjdGlvbk1vZGlmeVByZWZpeFVSTCk7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZmluZCBvbGQgcHJlZml4Ci0JCW9sZFByZWZpeCA9IHNlcnZlci5nZXRVUkxQcmVmaXgoKTsKLQotCQkvLyBtYWtlIHRoZSBjaGFuZ2UKLQkJc2VydmVyLnNldFVSTFByZWZpeChwcmVmaXgpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFVSTFByZWZpeChvbGRQcmVmaXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQzZjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXI7Ci0vKioKLSAqIFNlcnZlciBjb21tYW5kLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgSHR0cFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSHR0cFNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl1bmRvKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2ZDQ5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZDdkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODc2OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk0ZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgTWFyIDA4IDEzOjAyOjM5IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiOWQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbC5IdHRwVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwZmJmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy93aXpiYW4vc2VydmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy93aXpiYW4vc2VydmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGU5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvaWNvbnMvd2l6YmFuL3NlcnZlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZDA4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUhUVFAgU2VydmVyIFVJIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDJmMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUsb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnNlcnZlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvc2VydmVyLmdpZiIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICAgPGFkYXB0ZXI+Ci0gICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIvPgotICAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgICA8L2FkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUud2l6YXJkIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZEZyYWdtZW50cyI+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuc2VydmVyLndpemFyZCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBTZXJ2ZXJXaXphcmRGcmFnbWVudCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZVNlY3Rpb25zIj4KLSAgIAk8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5lZGl0b3IiCi0gICAgICAgICBvcmRlcj0iMTAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcubGVmdCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBTZWN0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzI2NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLS8qKgotICogQ29uc3RhbnQgaWRzIGZvciBjb250ZXh0IGhlbHAuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0VESVRPUiA9IEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnR3bnIwMDAwIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWM5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwUnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDOwotCXByb3RlY3RlZCBIdHRwUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBUZXh0IG5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgcHVibGlzaERpcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvKioKLQkgKiBIdHRwUnVudGltZUNvbXBvc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIHRoZSB3aXphcmQgaGFuZGxlCi0JICovCi0JcHVibGljIEh0dHBSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpemFyZFRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpemFyZERlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihIdHRwVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEh0dHBVSVBsdWdpbi5JTUdfV0laX1NFUlZFUikpOwotCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChIdHRwUnVudGltZSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihIdHRwUnVudGltZS5jbGFzcywgbnVsbCk7Ci0JCX0KLQkJCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSBBcGFjaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlDb21wb3NpdGUgbmFtZUdyb3VwID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCW5hbWVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbmFtZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuUlVOVElNRV9DT01QT1NJVEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobmFtZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZU5hbWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbmFtZSA9IG5ldyBUZXh0KG5hbWVHcm91cCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljcmVhdGVQdWJsaXNoTG9jYXRpb25Hcm91cChuYW1lR3JvdXApOwotCQkKLQkJaW5pdCgpOwotCQl2YWxpZGF0ZSgpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQkJCi0JCW5hbWUuZm9yY2VGb2N1cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgcnVudGltZVdDID09IG51bGwgfHwgcnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJbmFtZS5zZXRUZXh0KHJ1bnRpbWVXQy5nZXROYW1lKCkpOwotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCXB1Ymxpc2hEaXIuc2V0VGV4dChydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlpZiAocnVudGltZVdDICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lMiA9IHJ1bnRpbWVXQy5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZTIgPT0gbnVsbCB8fCBuYW1lMi50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCXdpemFyZC5zZXRNZXNzYWdlKE1lc3NhZ2VzLndpemFyZE1pc3NpbmdSdW50aW1lTmFtZSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gb2sgPSBjaGVja1J1bnRpbWVOYW1lKG5hbWUyKTsKLQkJCQlpZiAoIW9rKSB7Ci0JCQkJCXdpemFyZC5zZXRNZXNzYWdlKE1lc3NhZ2VzLndpemFyZER1cGxpY2F0ZU5hbWUsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQdWJsaXNoTG9jYXRpb25Hcm91cChDb21wb3NpdGUgcHVibGlzaEluZm9Hcm91cCkgewotCQlGb250IGZvbnQgPSBwdWJsaXNoSW5mb0dyb3VwLmdldEZvbnQoKTsKLQkJLy8gbG9jYXRpb24gbGFiZWwKLQkJTGFiZWwgbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChwdWJsaXNoSW5mb0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmb250KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnB1Ymxpc2hEaXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBwcm9qZWN0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0JCXB1Ymxpc2hEaXIgPSBuZXcgVGV4dChwdWJsaXNoSW5mb0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwdWJsaXNoRGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1Ymxpc2hEaXIuc2V0Rm9udChmb250KTsKLQkJcHVibGlzaERpci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TG9jYXRpb24obmV3IFBhdGgocHVibGlzaERpci5nZXRUZXh0KCkpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwdWJsaXNoSW5mb0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5icm93c2UpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKEh0dHBSdW50aW1lQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VsZWN0SW5zdGFsbERpcik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHVibGlzaERpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCXB1Ymxpc2hEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1J1bnRpbWVOYW1lKFN0cmluZyBuYW1lMikgewotCQluYW1lMiA9IG5hbWUyLnRyaW0oKTsKLQkJaWYgKG5hbWUyLmVxdWFscyhydW50aW1lV0MuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lIHJ1bnRpbWUyIDogcnVudGltZXMpIHsKLQkJCQlpZiAobmFtZTIuZXF1YWxzKHJ1bnRpbWUyLmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczOWIyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogSFRUUCBydW50aW1lIHdpemFyZCBmcmFnbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIEh0dHBSdW50aW1lQ29tcG9zaXRlIGNvbXA7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJXaXphcmRGcmFnbWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBIdHRwUnVudGltZVdpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGFzay5XaXphcmRGcmFnbWVudCNjcmVhdGVDb21wb3NpdGUoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgSHR0cFJ1bnRpbWVDb21wb3NpdGUocGFyZW50LCB3aXphcmQpOwotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQjZW50ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJY29tcC5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG51bGwpOwotCQlyZXR1cm4gKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDlkMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kLk1vZGlmeVBvcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQuTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuY29tbWFuZC5Nb2RpZnlVUkxQcmVmaXhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBIdHRwU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByb3RlY3RlZCBIdHRwU2VydmVyIGh0dHBTZXJ2ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0JcHJvdGVjdGVkIFRleHQgdXJsUHJlZml4VGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDaGVja0JveDsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBwb3J0U3Bpbm5lcjsKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBIdHRwU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfUE9SVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlwb3J0U3Bpbm5lci5zZXRTZWxlY3Rpb24oaS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfVVJMX1BSRUZJWC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQkJCXVybFByZWZpeFRleHQuc2V0VGV4dChzKTsKLQkJCQl9IGVsc2UgaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfSVNfUFVCTElTSElORy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQkJcHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJc2VydmVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0JCQotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JTZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA4OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA4OwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJCi0JCS8vIFVSTCBwcmVmaXgKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLmVkaXRvclVSTFByZWZpeCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJLy9kYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl1cmxQcmVmaXhUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8vZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVybFByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdXJsUHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZChodHRwU2VydmVyLCB1cmxQcmVmaXhUZXh0LmdldFRleHQoKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gcG9ydAotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLmVkaXRvclBvcnQpOwotCQkKLQkJcG9ydFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlwb3J0U3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlwb3J0U3Bpbm5lci5zZXRNaW5pbXVtKDk5OTk5OSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcG9ydFNwaW5uZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcG9ydFNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVBvcnRDb21tYW5kKGh0dHBTZXJ2ZXIsIHBvcnRTcGlubmVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBpcyBwdWJsaXNoaW5nCi0JCXB1Ymxpc2hDaGVja0JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlwdWJsaXNoQ2hlY2tCb3guc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JTaG91bGRQdWJsaXNoKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHVibGlzaENoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1Ymxpc2hDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBzZS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQoaHR0cFNlcnZlciwgYi5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCh0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKElGb3JtQ29sb3JzLlRJVExFKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlodHRwU2VydmVyID0gKEh0dHBTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLCBudWxsKTsKLQkJYWRkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAodXJsUHJlZml4VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl1cGRhdGluZyA9IHRydWU7Ci0JCQotCQlTdHJpbmcgdXJsUHJlZml4ID0gaHR0cFNlcnZlci5nZXRVUkxQcmVmaXgoKTsKLQkJaWYgKHVybFByZWZpeCAhPSBudWxsKQotCQkJdXJsUHJlZml4VGV4dC5zZXRUZXh0KHVybFByZWZpeCk7Ci0JCXVybFByZWZpeFRleHQuc2V0RW5hYmxlZCghcmVhZE9ubHkpOwotCQkKLQkJcG9ydFNwaW5uZXIuc2V0U2VsZWN0aW9uKGh0dHBTZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJcG9ydFNwaW5uZXIuc2V0RW5hYmxlZCghcmVhZE9ubHkpOwotCQkKLQkJcHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbihodHRwU2VydmVyLmlzUHVibGlzaGluZygpKTsKLQkJcHVibGlzaENoZWNrQm94LnNldEVuYWJsZWQoIXJlYWRPbmx5KTsKLQkJdXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZTEyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIFdpemFyZCBwYWdlIHRvIHNldCB0aGUgc2VydmVyIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDOwotCXByb3RlY3RlZCBIdHRwU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXg7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgcG9ydDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDaGVja0JveDsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvKioKLQkgKiBIdHRwU2VydmVyQ29tcG9zaXRlCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgSHR0cFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXphcmRUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXphcmREZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSHR0cFVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihIdHRwVUlQbHVnaW4uSU1HX1dJWl9TRVJWRVIpKTsKLQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyKElTZXJ2ZXJXb3JraW5nQ29weSBuZXdTZXJ2ZXIpIHsKLQkJaWYgKG5ld1NlcnZlciA9PSBudWxsKSB7Ci0JCQlzZXJ2ZXJXQyA9IG51bGw7Ci0JCQlzZXJ2ZXIgPSBudWxsOwotCQl9IGVsc2UgewotCQkJc2VydmVyV0MgPSBuZXdTZXJ2ZXI7Ci0JCQlzZXJ2ZXIgPSAoSHR0cFNlcnZlcikgbmV3U2VydmVyLmxvYWRBZGFwdGVyKEh0dHBTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIWlzRGlzcG9zZWQoKSkKLQkJCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSBBcGFjaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlJVTlRJTUVfQ09NUE9TSVRFKTsKLQkJCi0JCWNyZWF0ZVNlcnZlckluZm9Hcm91cChjb21wKTsKLQkJCi0JCUZvbnQgZm9udCA9IGNvbXAuZ2V0Rm9udCgpOwotCQlwdWJsaXNoQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCXB1Ymxpc2hDaGVja0JveC5zZXRUZXh0KE1lc3NhZ2VzLnNob3VsZFB1Ymxpc2gpOwotCQlwdWJsaXNoQ2hlY2tCb3guc2V0Rm9udChmb250KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHVibGlzaENoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlwdWJsaXNoQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgc2UuZ2V0U291cmNlKCk7Ci0JCQkJc2VydmVyLnNldFB1Ymxpc2hpbmcoYi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJcG9ydC5mb3JjZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKHBvcnQgPT0gbnVsbCB8fCBzZXJ2ZXJXQyA9PSBudWxsIHx8IHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcG9ydC5zZXRTZWxlY3Rpb24oc2VydmVyLmdldFBvcnQoKSk7Ci0JCXByZWZpeC5zZXRUZXh0KHNlcnZlci5nZXRVUkxQcmVmaXgoKSk7Ci0JCQotCQlib29sZWFuIGNhblB1Ymxpc2ggPSBzZXJ2ZXIuaXNQdWJsaXNoaW5nKCk7Ci0JCXB1Ymxpc2hDaGVja0JveC5zZXRTZWxlY3Rpb24oY2FuUHVibGlzaCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCS8qaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ki8KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmVySW5mb0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJCi0JCS8vIHBvcnQgbGFiZWwKLQkJTGFiZWwgcG9ydExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwb3J0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcG9ydExhYmVsLnNldFRleHQoTWVzc2FnZXMucG9ydCk7Ci0JCQotCQkvLyBwb3J0IGVudHJ5IGZpZWxkCi0JCXBvcnQgPSBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlwb3J0LnNldE1pbmltdW0oMCk7Ci0JCXBvcnQuc2V0TWF4aW11bSg5OTk5OTkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzA1OwotCQlwb3J0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXBvcnQuc2V0Rm9udChmb250KTsKLQkJcG9ydC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gcHJlZml4IGxhYmVsCi0JCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcmVmaXhMYWJlbC5zZXRGb250KGZvbnQpOwotCQlwcmVmaXhMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlVSTFByZWZpeCk7Ci0JCQotCQkvLyBwcmVmaXggZW50cnkgZmllbGQKLQkJcHJlZml4ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDMwNTsKLQkJcHJlZml4LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByZWZpeC5zZXRGb250KGZvbnQpOwotCQlwcmVmaXguYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2VydmVyLnNldFVSTFByZWZpeChwcmVmaXguZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvSHR0cFNlcnZlcldpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTEyMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBIVFRQIHNlcnZlciB3aXphcmQgZnJhZ21lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIEh0dHBTZXJ2ZXJDb21wb3NpdGUgY29tcDsKLQotCS8qKgotCSAqIFNlcnZlcldpemFyZEZyYWdtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEh0dHBTZXJ2ZXJXaXphcmRGcmFnbWVudCgpIHsKLQkJc2V0Q29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGFzay5XaXphcmRGcmFnbWVudCNjcmVhdGVDb21wb3NpdGUoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgSHR0cFNlcnZlckNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudCNlbnRlcigpCi0JICovCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBydW50aW1lID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQljb21wLnNldFNlcnZlcihydW50aW1lKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczYmZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIjsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+KCk7Ci0KLQkvLyBiYXNlIHVybCBmb3IgaWNvbnMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1dJWkJBTiA9ICJ3aXpiYW4vIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laX1NFUlZFUiA9ICJ3aXpTZXJ2ZXIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEh0dHBVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSHR0cFVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEh0dHBVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfV0laX1NFUlZFUiwgVVJMX1dJWkJBTiArICJzZXJ2ZXJfd2l6LmdpZiIpOwotCQkKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhcnRpYWxVUkwgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckltYWdlKEltYWdlUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7Ci0JCWlmIChJQ09OX0JBU0VfVVJMID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoU3VmZml4ID0gImljb25zLyI7Ci0JCQlJQ09OX0JBU0VfVVJMID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwKLQkJCQkJcGFydGlhbFVSTCkpOwotCQkJcmVnaXN0cnkucHV0KGtleSwgaWQpOwotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UiLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDUwMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTFByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG91bGRQdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0SW5zdGFsbERpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmREdXBsaWNhdGVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpemFyZE1pc3NpbmdSdW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVSTFByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNob3VsZFB1Ymxpc2g7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjY3Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcnVudGltZU5hbWU9TmEmbWU6Ci1icm93c2U9QiZyb3dzZS4uLgotcG9ydD1IVFRQICZQb3J0OgotVVJMUHJlZml4PSZVUkwgUHJlZml4OgotcHVibGlzaERpcj1QdWJsaXNoaW5nICZEaXJlY3Rvcnk6Ci1zaG91bGRQdWJsaXNoPUVuYWJsZSBwJnVibGlzaGluZyB0byB0aGlzIHNlcnZlcgotCi1zZWxlY3RJbnN0YWxsRGlyPVNlbGVjdCBIVFRQIHNlcnZlciBkb2N1bWVudCByb290LgotCi0jIEFwYWNoZSBzZXJ2ZXIgd2l6YXJkIGFuZCBlZGl0b3IKLXdpemFyZFRpdGxlPUhUVFAgU2VydmVyCi13aXphcmREZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBIVFRQIHNlcnZlciBpbmZvcm1hdGlvbgotd2l6YXJkRHVwbGljYXRlTmFtZT1EdXBsaWNhdGUgU2VydmVyIE5hbWUKLXdpemFyZE1pc3NpbmdSdW50aW1lTmFtZT1NaXNzaW5nIFJ1bnRpbWUgTmFtZQotCi1lZGl0b3JTZWN0aW9uVGl0bGU9SFRUUCBTZXJ2ZXIKLWVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHB1Ymxpc2hpbmcgZGlyZWN0b3J5IGFuZCBVUkwuCi1lZGl0b3JVUkxQcmVmaXg9VVJMIFByZWZpeDoKLWVkaXRvclBvcnQ9SFRUUCBQb3J0OgotZWRpdG9yU2hvdWxkUHVibGlzaD1FbmFibGUgcHVibGlzaGluZyB0byB0aGlzIHNlcnZlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZjUwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1J1bnRpbWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIFN1cHBvcnQgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0JcHVibGljIFJ1bnRpbWVMYWJlbFByb3ZpZGVyKGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCXRoaXMucmMgPSByYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gcmMuZ2V0UHJvcGVydHkoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgUnVudGltZUxhYmVsUHJvdmlkZXIocmMpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmMzMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVIgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJSHR0cFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSHR0cFVJUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFIdHRwVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihIdHRwVUlQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmQ0OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGQ3ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE5MjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjMWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTE6NTIgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzVjMTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmUuUHJldmlld1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YzVlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvaWNvbnMvb2JqMTYvcHJldmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc5ZDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1IVFRQIFByZXZpZXcgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLXByZXZpZXdSdW50aW1lVHlwZU5hbWU9SFRUUCBQcmV2aWV3Ci1wcmV2aWV3UnVudGltZVR5cGVEZXNjcmlwdGlvbj1BIHJ1bnRpbWUgdG8gYnVpbGQgc3RhdGljIFdlYiBtb2R1bGVzLgotCi1wcmV2aWV3U2VydmVyVHlwZU5hbWU9SFRUUCBQcmV2aWV3Ci1wcmV2aWV3U2VydmVyVHlwZURlc2NyaXB0aW9uPUEgc2VydmVyIHRvIHByZXZpZXcgc3RhdGljIFdlYiBtb2R1bGVzLgotCi1wcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGU9SFRUUCBQcmV2aWV3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY0YTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIG5hbWU9IiVwcmV2aWV3UnVudGltZVR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1J1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLQkgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnNlcnZlciIKLSAgICAgICBuYW1lPSIlcHJldmlld1NlcnZlclR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHZlcnNpb249IjEuMCIvPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJ3c3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVwcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICA8aW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcudWkiCi0gICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSxvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuc2VydmVyIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvcHJldmlldy5naWYiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHBhdGg9Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjZXQgaWQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9kZWZhdWx0LWZhY2V0cz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgICBjb25maWdUeXBlSUQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLnVpLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MWFkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzg2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Nb2RpZnlNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0dHBQb3J0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuY29yZS5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJlZDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWh0dHBQb3J0PUhUVFAgUG9ydAotY2FuTW9kaWZ5TW9kdWxlcz1XZWIgbW9kdWxlcyBjYW4gYmUgbW9kaWZpZWQuCi0KLWVycm9yUHVibGlzaD1FcnJvciBkdXJpbmcgcHVibGlzaAotZXJyb3JQb3J0SW5Vc2U9UG9ydCB7MH0gcmVxdWlyZWQgYnkgezF9IGlzIGFscmVhZHkgaW4gdXNlLiBUaGUgc2VydmVyIG1heSBhbHJlYWR5IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLCBvciBhIHN5c3RlbSBwcm9jZXNzIG1heSBiZSB1c2luZyB0aGUgcG9ydC4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHN0b3AgdGhlIG90aGVyIHByb2Nlc3Mgb3IgY2hhbmdlIHRoZSBwb3J0IG51bWJlcihzKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZhMGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgUHJldmlld1NlcnZlckJlaGF2aW91ciBiZWhhdmlvdXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUGluZ1RocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIHVybAotCSAqIEBwYXJhbSBiZWhhdmlvdXIKLQkgKi8KLQlwdWJsaWMgUGluZ1RocmVhZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIHVybCwgUHJldmlld1NlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMudXJsID0gdXJsOwotCQl0aGlzLmJlaGF2aW91ciA9IGJlaGF2aW91cjsKLQkJdGhpcy5tYXhQaW5ncyA9IGd1ZXNzTWF4UGluZ3MoKTsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJQcmV2aWV3IFBpbmcgVGhyZWFkIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBndWVzc01heFBpbmdzKCkgewotCQlpbnQgc3RhcnRUaW1lb3V0ID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRTdGFydFRpbWVvdXQoKSAqIDEwMDA7Ci0JCWlmIChzdGFydFRpbWVvdXQgPiAwKQotCQkJcmV0dXJuIHN0YXJ0VGltZW91dCAvIFBJTkdfSU5URVJWQUw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBQaW5nIHRoZSBzZXJ2ZXIgdW50aWwgaXQgaXMgc3RhcnRlZC4gVGhlbiBzZXQgdGhlIHNlcnZlcgotCSAqIHN0YXRlIHRvIFNUQVRFX1NUQVJURUQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXdoaWxlICghc3RvcCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY291bnQgPT0gbWF4UGluZ3MpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNlcnZlci5zdG9wKGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGNvdWxkIG5vdCBzdG9wIHNlcnZlciIpOwotCQkJCQl9Ci0JCQkJCXN0b3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY291bnQrKzsKLQkJCQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nICIgKyBjb3VudCk7Ci0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uID0gcGluZ1VybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubikuZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCi0JCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7Ci0JCXN0b3AgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk4YmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX0JVTkRMRV9JRFMgPSBuZXcgU3RyaW5nW10gewotCQkib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciLAotCQkiamF2YXguc2VydmxldCIsCi0JCSJqYXZheC5zZXJ2bGV0LmpzcCIsCi0JCSJvcmcubW9ydGJheS5qZXR0eSIsCi0JCSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZnQ2FuZGlkYXRlSmF2YUZpbGVzID0geyJqYXZhdyIsICJqYXZhdy5leGUiLCAiamF2YSIsCi0JCSJqYXZhLmV4ZSIsICJqOXciLCAiajl3LmV4ZSIsICJqOSIsICJqOS5leGUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnMgPSB7ImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXIsCi0JCSJqcmUiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmludGVybmFsLlByZXZpZXdTdGFydGVyIjsKLQotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxhdW5jaCBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBmaW5kIHNlcnZlciIpOwotCQkJLy8gdGhyb3cgQ29yZUV4Y2VwdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSkKLQkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0JCQotCQlQcmV2aWV3U2VydmVyQmVoYXZpb3VyIHByZXZpZXdTZXJ2ZXIgPSAoUHJldmlld1NlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MsIG51bGwpOwotCQkKLQkJaW50IHNpemUgPSBSRVFVSVJFRF9CVU5ETEVfSURTLmxlbmd0aDsKLQkJLy9TdHJpbmdbXSBqYXJzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJU3RyaW5nQnVmZmVyIGNwID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCWlmIChiICE9IG51bGwpCi0JCQkJcGF0aCA9IFByZXZpZXdSdW50aW1lLmdldEphcnJlZFBsdWdpblBhdGgoYik7Ci0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgZmluZCByZXF1aXJlZCBidW5kbGUgIiArIFJFUVVJUkVEX0JVTkRMRV9JRFNbaV0pKTsKLQkJCQotCQkJaWYgKGkgPT0gNCAmJiBwYXRoLmFwcGVuZCgiYmluIikudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKCJiaW4iKTsKLQkJCQotCQkJaWYgKGkgPiAwKQotCQkJCWNwLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQkJY3AuYXBwZW5kKHBhdGgudG9PU1N0cmluZygpKTsKLQkJfQotCQkKLQkJTGlzdDxTdHJpbmc+IGNtZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCS8vIGpyZQotCQlGaWxlIGphdmEgPSBnZXRKYXZhRXhlY3V0YWJsZSgpOwotCQlpZiAoamF2YSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCBmaW5kIEpSRSBleGVjdXRhYmxlIikpOwotCQkKLQkJY21kcy5hZGQoamF2YS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQotCQljbWRzLmFkZCgiLWNsYXNzcGF0aCIpOwotCQljbWRzLmFkZChjcC50b1N0cmluZygpKTsKLQkJCi0JCWNtZHMuYWRkKE1BSU5fQ0xBU1MpOwotCQkKLQkJY21kcy5hZGQocHJldmlld1NlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJwcmV2aWV3LnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQotCQkvL3NldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJcHJldmlld1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGNtZExpbmUgPSBuZXcgU3RyaW5nW2NtZHMuc2l6ZSgpXTsKLQkJCWNtZHMudG9BcnJheShjbWRMaW5lKTsKLQkJCVByb2Nlc3MgcCA9IERlYnVnUGx1Z2luLmV4ZWMoY21kTGluZSwgbnVsbCk7Ci0JCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJSVByb2Nlc3MgcHIgPSBEZWJ1Z1BsdWdpbi5uZXdQcm9jZXNzKGxhdW5jaCwgcCwgY21kTGluZVswXSk7Ci0JCQkJcHIuc2V0QXR0cmlidXRlKElQcm9jZXNzLkFUVFJfQ01ETElORSwgcmVuZGVyQ29tbWFuZExpbmUoY21kTGluZSkpOwotCQkJCWxhdW5jaC5hZGRQcm9jZXNzKHByKTsKLQkJCQlwcmV2aWV3U2VydmVyLmFkZFByb2Nlc3NMaXN0ZW5lcihwcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJQcm9ibGVtIGNyZWF0aW5nIHByZXZpZXcgcHJvY2VzcyIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2Ygc3RyaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpbmUKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVuZGVyQ29tbWFuZExpbmUoU3RyaW5nW10gY29tbWFuZExpbmUpIHsKLQkJaWYgKGNvbW1hbmRMaW5lLmxlbmd0aCA8IDEpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY29tbWFuZExpbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJCWNoYXJbXSBjaGFyYWN0ZXJzPSBjb21tYW5kTGluZVtpXS50b0NoYXJBcnJheSgpOwotCQkJU3RyaW5nQnVmZmVyIGNvbW1hbmQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gY29udGFpbnNTcGFjZT0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNoYXJhY3RlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQljaGFyIGNoYXJhY3Rlcj0gY2hhcmFjdGVyc1tqXTsKLQkJCQlpZiAoY2hhcmFjdGVyID09ICdcIicpIHsKLQkJCQkJY29tbWFuZC5hcHBlbmQoJ1xcJyk7Ci0JCQkJfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gJyAnKSB7Ci0JCQkJCWNvbnRhaW5zU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCQljb21tYW5kLmFwcGVuZChjaGFyYWN0ZXIpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5zU3BhY2UpIHsKLQkJCQlidWYuYXBwZW5kKCdcIicpOwotCQkJCWJ1Zi5hcHBlbmQoY29tbWFuZC50b1N0cmluZygpKTsKLQkJCQlidWYuYXBwZW5kKCdcIicpOwotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNvbW1hbmQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZ2V0SmF2YUV4ZWN1dGFibGUoKSB7Ci0JCS8vIGRvIG5vdCBkZXRlY3Qgb24gdGhlIE1hYyBPUwotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoQ29uc3RhbnRzLk9TX01BQ09TWCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIHJldHJpZXZlIHRoZSAnamF2YS5ob21lJyBzeXN0ZW0gcHJvcGVydHkuIElmIHRoYXQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHJldHVybiBudWxsCi0JCUZpbGUgamF2YUhvbWU7IAotCQl0cnkgewotCQkJamF2YUhvbWUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghamF2YUhvbWUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIGZpbmQgdGhlICdqYXZhJyBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGhlIGphdmEgaG9tZSBkaXJlY3RvcnkuIElmIGl0IGNhbid0IGJlCi0JCS8vIGZvdW5kLCByZXR1cm4gbnVsbAotCQlyZXR1cm4gZmluZEphdmFFeGVjdXRhYmxlKGphdmFIb21lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZmluZEphdmFFeGVjdXRhYmxlKEZpbGUgdm1JbnN0YWxsTG9jYXRpb24pIHsKLQkJLy8gdHJ5IGVhY2ggY2FuZGlkYXRlIGluIG9yZGVyLCB0aGUgZmlyc3Qgb25lIGZvdW5kIHdpbnMuIFRodXMsIHRoZSBvcmRlcgotCQkvLyBvZiBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnMgYW5kIGZnQ2FuZGlkYXRlSmF2YUZpbGVzIGlzIHNpZ25pZmljYW50Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDYW5kaWRhdGVKYXZhRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmdDYW5kaWRhdGVKYXZhTG9jYXRpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKHZtSW5zdGFsbExvY2F0aW9uLCBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnNbal0gKyBmZ0NhbmRpZGF0ZUphdmFGaWxlc1tpXSk7Ci0JCQkJaWYgKGphdmFGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJCXJldHVybiBqYXZhRmlsZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG51bGw7CQkJCQkJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWQ5ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5XZWJSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoKLQkgKiBAc2VlIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUjZ2V0TGF1bmNoYWJsZShJU2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsIHx8IG1vZHVsZUFydGlmYWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVByZXZpZXdTZXJ2ZXIgc2VydmVyMiA9IChQcmV2aWV3U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoUHJldmlld1NlcnZlci5jbGFzcywgbnVsbCk7Ci0JCWlmIChzZXJ2ZXIyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gc2VydmVyMi5nZXRNb2R1bGVSb290VVJMKG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpKTsKLQkJCQotCQkJaWYgKG1vZHVsZUFydGlmYWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpIHsKLQkJCQlXZWJSZXNvdXJjZSByZXNvdXJjZSA9IChXZWJSZXNvdXJjZSkgbW9kdWxlQXJ0aWZhY3Q7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkKLQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybC50b0V4dGVybmFsRm9ybSgpICsgIi8iICsgcGF0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiBsYXVuY2hhYmxlIGFkYXB0ZXIiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGFjOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgSFRUUCBzZXJ2ZXIgY29yZSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJldmlld1BsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgcnVudGltdCB0eXBlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShpZCwgdmFsdWUpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJlYzIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1J1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLS8qKgotICogSFRUUCBwcmV2aWV3IHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3UnVudGltZSBleHRlbmRzIFJ1bnRpbWVEZWxlZ2F0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByZXZpZXcgcnVudGltZS4KLQkgKi8KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBidW5kbGUuCi0JICogCi0JICogQHJldHVybiBhIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFBhdGggZ2V0UGx1Z2luUGF0aChCdW5kbGUgYnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGdldEphcnJlZFBsdWdpblBhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCByZXR1cm4gbnVsbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2I5OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotLyoqCi0gKiBIVFRQIHByZXZpZXcgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1NlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuc2VydmVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BPUlQgPSAicG9ydCI7Ci0KLQkvKioKLQkgKiBQcmV2aWV3U2VydmVyLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUgZ2V0UHJldmlld1J1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChQcmV2aWV3UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFByZXZpZXdSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgVVJMIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2xvY2FsaG9zdCI7Ci0JCQkKLQkJCWludCBwb3J0ID0gZ2V0UG9ydCgpOwotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQlpZiAocG9ydCA9PSA4MCkKLQkJCQl1cmwgPSBuZXcgVVJMKGJhc2UgKyAiLyIpOwotCQkJZWxzZQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICI6IiArIHBvcnQgKyAiLyIpOwotCQkJCi0JCQlTdHJpbmcgdHlwZSA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmICgid3N0LndlYiIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJSVN0YXRpY1dlYiBzdGF0aWNXZWIgPSAoSVN0YXRpY1dlYikgbW9kdWxlLmxvYWRBZGFwdGVyKElTdGF0aWNXZWIuY2xhc3MsIG51bGwpOwotCQkJCXJldHVybiBuZXcgVVJMKHVybCwgc3RhdGljV2ViLmdldENvbnRleHRSb290KCkpOwotCQkJfQotCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgcm9vdCBVUkwiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSByb290IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciwgYW5kIGZhbHNlCi0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGQgbW9kdWxlcwotCSAqIEBwYXJhbSByZW1vdmUgbW9kdWxlcwotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuY2FuTW9kaWZ5TW9kdWxlcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCVNlcnZlclBvcnRbXSBwb3J0cyA9IHsgbmV3IFNlcnZlclBvcnQoImh0dHAiLCBNZXNzYWdlcy5odHRwUG9ydCwgcG9ydCwgImh0dHAiKSB9OwotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFByZXZpZXdTZXJ2ZXIuUFJPUEVSVFlfUE9SVCwgODA4MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgewotCQlzZXRBdHRyaWJ1dGUoUHJldmlld1NlcnZlci5QUk9QRVJUWV9QT1JULCBwb3J0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgY3JlYXRlUHJldmlld1NlcnZlcihTdHJpbmcgc2VydmVyTmFtZSkgewotCQl0cnkgewotCQkJTnVsbFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKFByZXZpZXdSdW50aW1lLklEKTsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZUNvcHkgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKFByZXZpZXdSdW50aW1lLklELCBtb25pdG9yKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShJRCk7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbW9uaXRvcik7Ci0JCQl3b3JraW5nQ29weS5zZXROYW1lKHNlcnZlck5hbWUpOwotCQkJd29ya2luZ0NvcHkuc2V0SG9zdCgibG9jYWxob3N0Iik7Ci0JCQlyZXR1cm4gd29ya2luZ0NvcHkuc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZmluZFByZXZpZXdTZXJ2ZXIoU3RyaW5nIGlkKSB7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7Ci0JCQlpZiAoc2VydmVyLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gc2VydmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcmV2aWV3U2VydmVyIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNDE5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0vKioKLSAqIFByZXZpZXcgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1NlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCXByb3RlY3RlZCB0cmFuc2llbnQgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBQcmV2aWV3U2VydmVyLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyQmVoYXZpb3VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUgZ2V0UHJldmlld1J1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoUHJldmlld1J1bnRpbWUpIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihQcmV2aWV3UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIFByZXZpZXdTZXJ2ZXIgZ2V0UHJldmlld1NlcnZlcigpIHsKLQkJcmV0dXJuIChQcmV2aWV3U2VydmVyKSBnZXRTZXJ2ZXIoKS5nZXRBZGFwdGVyKFByZXZpZXdTZXJ2ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBwYXRocyBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR1cCBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIElMYXVuY2gKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cExhdW5jaChJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjaGVjayB0aGF0IHBvcnRzIGFyZSBmcmVlCi0JCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFByZXZpZXdTZXJ2ZXIoKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQlpbnQgcG9ydCA9IHBvcnRzWzBdLmdldFBvcnQoKTsKLQkJCi0JCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHBvcnQsIDUpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydCArICIiLCBnZXRTZXJ2ZXIoKS5nZXROYW1lKCl9KSwgbnVsbCkpOwotCQkKLQkJLy8gZ2VuZXJhdGUgcHJldmlldyBjb25maWcgZmlsZQotCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic2VydmVyIik7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcigicG9ydCIsIHBvcnQpOwotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRTZXJ2ZXIoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQlJTWVtZW50byBtb2QgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb2R1bGUiKTsKLQkJCW1vZC5wdXRTdHJpbmcoIm5hbWUiLCBtb2R1bGUuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyB0eXBlID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKCJ3c3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQkJbW9kLnB1dFN0cmluZygiY29udGV4dCIsIHN0YXRpY1dlYi5nZXRDb250ZXh0Um9vdCgpKTsKLQkJCQltb2QucHV0U3RyaW5nKCJ0eXBlIiwgInN0YXRpYyIpOwotCQkJfQotCQkJbW9kLnB1dFN0cmluZygicGF0aCIsIGdldE1vZHVsZVB1Ymxpc2hEaXJlY3RvcnkobW9kdWxlKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZCgicHJldmlldy54bWwiKS50b09TU3RyaW5nKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgd3JpdGUgcHJldmlldyBjb25maWciLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3Qgd3JpdGUgcHJldmlldyBjb25maWd1cmF0aW9uIiwgbnVsbCkpOwotCQl9Ci0JCQotCQlzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoZmFsc2UpOwotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJUSU5HKTsKLQkJc2V0TW9kZShsYXVuY2hNb2RlKTsKLQkJCi0JCS8vIHBpbmcgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3QiOwotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdXJsICs9ICI6IiArIHBvcnQ7Ci0JCQlwaW5nID0gbmV3IFBpbmdUaHJlYWQoZ2V0U2VydmVyKCksIHVybCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDYW4ndCBwaW5nIGZvciBUb21jYXQgc3RhcnR1cC4iKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NMaXN0ZW5lcihmaW5hbCBJUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCB8fCBuZXdQcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlpZiAoZXZlbnRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChEZWJ1Z0V2ZW50IGV2ZW50IDogZXZlbnRzKSB7Ci0JCQkJCQlpZiAobmV3UHJvY2VzcyAhPSBudWxsICYmIG5ld1Byb2Nlc3MuZXF1YWxzKGV2ZW50LmdldFNvdXJjZSgpKSAmJiBldmVudC5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpIHsKLQkJCQkJCQlzdG9wKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoU2VydmVyKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmRvbmUoKTsKLQotCQlzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qCi0JICogUHVibGlzaGVzIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlVHJlZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlVHJlZVttb2R1bGVUcmVlLmxlbmd0aCAtIDFdOyAKLQkJSVBhdGggdG8gPSBnZXRNb2R1bGVQdWJsaXNoRGlyZWN0b3J5KG1vZHVsZSk7Ci0JCQotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsKLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkodG8udG9GaWxlKCksIG1vbml0b3IpOwotCQkJdGhyb3dFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzID0gZ2V0UmVzb3VyY2VzKG1vZHVsZVRyZWUpOwotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaFNtYXJ0KHJlcywgdG8sIG1vbml0b3IpOwotCQl0aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZVRyZWUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byB0aHJvdyBhIENvcmVFeGNlcHRpb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBvZgotCSAqIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIGEgTGlzdCBjb250YWluaW5nIGVycm9yIGFuZCB3YXJuaW5nIElTdGF0dXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKElTdGF0dXNbXSBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChzdGF0dXMubGVuZ3RoID09IDEpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOwotCQkKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lcnJvclB1Ymxpc2g7Ci0JCU11bHRpU3RhdHVzIHN0YXR1czIgPSBuZXcgTXVsdGlTdGF0dXMoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIDAsIHN0YXR1cywgbWVzc2FnZSwgbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbmx5IHNodXRzIGRvd24gYW5kIHRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWludCBzdGF0ZSA9IGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCi0JCWlmIChwaW5nICE9IG51bGwpIHsKLQkJCXBpbmcuc3RvcCgpOwotCQkJcGluZyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCQkJcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIktpbGxpbmcgdGhlIHByb2Nlc3MiKTsKLQkJCUlMYXVuY2ggbGF1bmNoID0gZ2V0U2VydmVyKCkuZ2V0TGF1bmNoKCk7Ci0JCQlpZiAobGF1bmNoICE9IG51bGwpCi0JCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Iga2lsbGluZyB0aGUgcHJvY2VzcyIsIGUpOwotCQl9Ci0JCQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSdzIHB1Ymxpc2ggcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBkaXJlY3RvcnkgZm9yIHRoZSBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0TW9kdWxlUHVibGlzaERpcmVjdG9yeShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcmV2aWV3U2VydmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc5MmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ4eXoiOyAKLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGNyZWF0ZSBydW50aW1lCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkKLQkJZm9yIChJUnVudGltZSByIDogcnVudGltZXMpIHsKLQkJCWlmIChyLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBQcmV2aWV3UnVudGltZS5JRC5lcXVhbHMoci5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJaWYgKElELmVxdWFscyhyLmdldElkKCkpKQotCQkJCQlydW50aW1lID0gcjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShQcmV2aWV3UnVudGltZS5JRCk7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoSUQsIG51bGwpOwotCQkJCXdjLnNldE5hbWUoIk15IFByZXZpZXciKTsKLQkJCQl3Yy5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQlydW50aW1lID0gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBkZWZhdWx0IHByZXZpZXcgcnVudGltZSIpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBjcmVhdGUgc2VydmVyCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSVNlcnZlciBzIDogc2VydmVycykgewotCQkJaWYgKHMuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgUHJldmlld1NlcnZlci5JRC5lcXVhbHMocy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQlpZiAoSUQuZXF1YWxzKHMuZ2V0SWQoKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFmb3VuZCkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShQcmV2aWV3U2VydmVyLklEKTsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbnVsbCk7Ci0JCQkJd2Muc2V0TmFtZSgiTXkgcHJldmlldyIpOwotCQkJCXdjLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCQkJCXdjLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCXdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgZGVmYXVsdCBwcmV2aWV3IHNlcnZlciIpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc3YmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIxZjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiQ09ORklHICAgIiwgIldBUk5JTkcgICIsCi0JCSJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGxldmVsID09IFNFVkVSRSkKLQkJCVByZXZpZXdQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFQcmV2aWV3UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJLy8gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU2VydmVyQ29yZS5QTFVHSU5fSUQgKyAiLyIgKyAicmVzb3VyY2VzIik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3N2UzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1hNTE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNjcmVhdGVDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvcyBhbiBvdXRwdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWVtZW50byB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJc2F2ZSh3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGQ1MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvdWkvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci0vKioKLSAqIEEgZGVidWcgdGFiIGdyb3VwIGZvciBsYXVuY2hpbmcgdGhlIHByZXZpZXcgc2VydmVyLiAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0JLyoKLQkgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbMl07Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3IiB9KTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCS8qdGFic1syXSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOwotCQl0YWJzWzJdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsqLwotCQl0YWJzWzFdID0gbmV3IENvbW1vblRhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJc2V0VGFicyh0YWJzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMmI3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlXzMuMC4wLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjgzOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDM3YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFhMDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgQXVnIDE2IDE3OjAwOjE1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2MWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldzsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3U2VydmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5tb3J0YmF5LmpldHR5O2J1bmRsZS12ZXJzaW9uPSJbNS4xLjExLDYuMC4wKSIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7YnVuZGxlLXZlcnNpb249IlsxLjAuNCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3OTM0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhMDgwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVByZXZpZXcgU2VydmVyIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTgwNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJwcmV2aWV3IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3QXBwbGljYXRpb24iLz4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlOGQ4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbDsKLS8qKgotICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKLSAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKLSAqIDxvbD4KLSAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KLSAqICAgIDwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAotICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQotICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKLSAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQotICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCi0gKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCi0gKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKLSAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkM2I4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJVbmJvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDcmVhdGluZ1ppcEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm90QURpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhQcmV2aWV3U2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1YzYyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQotY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCi0KLWVycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KLWVycm9ySlJFPUludmFsaWQgSlJFLgotCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KLWVycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9Ci1lcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgotZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KLWVycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KLWVycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU3ODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGUgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljOwotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFBhdGg7Ci0KLQlwdWJsaWMgTW9kdWxlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzU3RhdGljLCBTdHJpbmcgY29udGV4dCwgU3RyaW5nIHByb2plY3RQYXRoKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5wcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNXZWIoKSB7Ci0JCXJldHVybiBpc1N0YXRpYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHByb2plY3RQYXRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdBcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9QcmV2aWV3QXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmY2Y2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JcHJvdGVjdGVkIFByZXZpZXdTdGFydGVyIHN0YXJ0ZXI7Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0ZXIgPSBuZXcgUHJldmlld1N0YXJ0ZXIobnVsbCk7Ci0JCXN0YXJ0ZXIucnVuKCk7Ci0JCXJldHVybiBFWElUX09LOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXN0YXJ0ZXIuc3RvcCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdTZXJ2ZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1NlcnZlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTlkMmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1NlcnZlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3IjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1NlcnZlclBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKYXZhU2VydmVyUGx1Z2luLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZXZpZXdTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0MikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQyKTsKLQkJY29udGV4dCA9IGNvbnRleHQyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0Mik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1N0YXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1N0YXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMTQ0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdTdGFydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuaGFuZGxlci5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuamV0dHkuKjsKLWltcG9ydCBvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdTdGFydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVkVSVEVEX0xPR1MgPSBuZXcgU3RyaW5nW10gewotCQkib3JnLm1vcnRiYXkudXRpbC5Db250YWluZXIiLCAib3JnLm1vcnRiYXkuaHR0cC5IdHRwU2VydmVyIiwKLQkJIm9yZy5tb3J0YmF5LnV0aWwuQ3JlZGVudGlhbCIsICJvcmcubW9ydGJheS5odHRwLlNvY2tldExpc3RlbmVyIiwKLQkJIm9yZy5tb3J0YmF5Lmh0dHAuSHR0cFNlcnZlciIsICJvcmcubW9ydGJheS5qZXR0eS5TZXJ2ZXIiCi0JfTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29uZmlnUGF0aDsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBQcmV2aWV3U3RhcnRlcihTdHJpbmcgY29uZmlnUGF0aCkgewotCQl0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJUHJldmlld1N0YXJ0ZXIgYXBwID0gbmV3IFByZXZpZXdTdGFydGVyKGFyZ3NbMF0pOwotCQlhcHAucnVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHByZXZpZXcgc2VydmVyIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl0cnkgewotCQkJU2VydmVyQ29uZmlnIGNvbmZpZyA9IG5ldyBTZXJ2ZXJDb25maWcoY29uZmlnUGF0aCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcnQgIiArIGNvbmZpZy5nZXRQb3J0KCkpOwotCQkJTW9kdWxlW10gbSA9IGNvbmZpZy5nZXRNb2R1bGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IG0ubGVuZ3RoOwotCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2R1bGVzOiIpOwotCQkJCWZvciAoTW9kdWxlIG1tIDogbSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBtbS5nZXROYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJCi0JCQlmb3IgKFN0cmluZyBsb2cgOiBBVkVSVEVEX0xPR1MpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihsb2cpOwotCQkJCWxvZ2dlci5zZXRGaWx0ZXIobmV3IEZpbHRlcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gaXNMb2dnYWJsZShMb2dSZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkF2ZXJ0ZWQgSmV0dHkgbG9nOiAiICsgcmVjb3JkLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYXZlcnRlZDogIiArIHJlY29yZC5nZXRMb2dnZXJOYW1lKCkgKyAiOiAiICsgcmVjb3JkLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCQotCQkJLy8gaGVscGVyIGNvZGUgdG8gZmluZCBqZXR0eSBsb2dnZXJzCi0JCQkvKkxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJvcmcubW9ydGJheS5odHRwLkh0dHBTZXJ2ZXIiKTsKLQkJCWxvZ2dlci5hZGRIYW5kbGVyKG5ldyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHB1Ymxpc2goTG9nUmVjb3JkIHJlY29yZCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dlciBmb3VuZDogIiArIHJlY29yZC5nZXRMb2dnZXJOYW1lKCkpOwotCQkJCX0KLQkJCX0pOyovCi0JCQkKLQkJCXNlcnZlciA9IG5ldyBTZXJ2ZXIoKTsKLQkJCXNlcnZlci5hZGRMaXN0ZW5lcigiOiIgKyBjb25maWcuZ2V0UG9ydCgpKTsKLQkJCXNlcnZlci5zZXRUcmFjZShmYWxzZSk7Ci0JCQlzZXJ2ZXIuc2V0U3RhdHNPbihmYWxzZSk7Ci0JCQkKLQkJCUh0dHBDb250ZXh0IGNvbnRleHQyID0gbmV3IEh0dHBDb250ZXh0KCk7Ci0JCQljb250ZXh0Mi5zZXRDb250ZXh0UGF0aCgiLyIpOwotCQkJY29udGV4dDIuYWRkSGFuZGxlcihuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCWNvbnRleHQyLnNldEF0dHJpYnV0ZShIdHRwQ29udGV4dC5fX0Vycm9ySGFuZGxlciwgbmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQlzZXJ2ZXIuYWRkQ29udGV4dChjb250ZXh0Mik7Ci0JCQlzZXJ2ZXIuc2V0Um9vdFdlYkFwcCgiLyIpOwotCQkJCi0JCQlmb3IgKE1vZHVsZSBtb2R1bGUgOiBtKSB7Ci0JCQkJaWYgKG1vZHVsZS5pc1N0YXRpY1dlYigpKSB7Ci0JCQkJCUh0dHBDb250ZXh0IGNvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTsKLQkJCQkJY29udGV4dC5zZXRDb250ZXh0UGF0aChtb2R1bGUuZ2V0Q29udGV4dCgpKTsKLQkJCQkJY29udGV4dC5zZXRSZXNvdXJjZUJhc2UobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJCWNvbnRleHQuYWRkSGFuZGxlcihuZXcgUmVzb3VyY2VIYW5kbGVyKCkpOwotCQkJCQljb250ZXh0LmFkZEhhbmRsZXIobmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKEh0dHBDb250ZXh0Ll9fRXJyb3JIYW5kbGVyLCBuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCQkJc2VydmVyLmFkZENvbnRleHQoY29udGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJV2ViQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBzZXJ2ZXIuYWRkV2ViQXBwbGljYXRpb24obW9kdWxlLmdldENvbnRleHQoKSwgbW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJCS8vY29udGV4dC5nZXRXZWJBcHBsaWNhdGlvbkhhbmRsZXIoKTsKLQkJCQkJLy9jb250ZXh0LmFkZEhhbmRsZXIobmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKEh0dHBDb250ZXh0Ll9fRXJyb3JIYW5kbGVyLCBuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcCEiKTsKLQkJCXNlcnZlci5zdG9wKCk7Ci0JCQkvL0ZpbGUgY29udGV4dFdvcmtEaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCBESVJfUFJFRklYICsgcGlkLmhhc2hDb2RlKCkpOwotCQkJLy9kZWxldGVEaXJlY3RvcnkoY29udGV4dFdvcmtEaXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURpcmVjdG9yeSBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byByZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSB0byBkZWxldGUuCi0JICogQHJldHVybiB3YXMgdGhlIGRlbGV0ZSBzdWNjZXNmdWwKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJCWZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlyZWN0b3J5LmRlbGV0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1NlcnZlckNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9TZXJ2ZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExY2M0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1NlcnZlckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlcnZlckNvbmZpZyB7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnUGF0aDsKLQlwcml2YXRlIE1vZHVsZVtdIG1vZHVsZXM7Ci0JcHJpdmF0ZSBpbnQgcG9ydCA9IDgwODA7Ci0KLQlwdWJsaWMgU2VydmVyQ29uZmlnKFN0cmluZyBjb25maWdQYXRoKSB7Ci0JCXRoaXMuY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGg7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJRmlsZSBmID0gbmV3IEZpbGUoY29uZmlnUGF0aCk7Ci0JCWlmICghZi5leGlzdHMoKSkKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ29uZmlnIGRvZXNuJ3QgZXhpc3QgYXQgIiArIGNvbmZpZ1BhdGgpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZik7Ci0JCQkJSW50ZWdlciBwcnQgPSBtZW1lbnRvLmdldEludGVnZXIoInBvcnQiKTsKLQkJCQlpZiAocHJ0ICE9IG51bGwpCi0JCQkJCXBvcnQgPSBwcnQuaW50VmFsdWUoKTsKLQkJCQkKLQkJCQlJTWVtZW50b1tdIG1vZHVsZXMyID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQkJTGlzdDxNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZT4oc2l6ZSk7Ci0JCQkJZm9yIChJTWVtZW50byBtb2QgOiBtb2R1bGVzMikgewotCQkJCQlTdHJpbmcgbmFtZSA9IG1vZC5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJCQkJYm9vbGVhbiBpc1N0YXRpYyA9ICJzdGF0aWMiLmVxdWFscyhtb2QuZ2V0U3RyaW5nKCJ0eXBlIikpOwotCQkJCQlTdHJpbmcgcGF0aCA9IG1vZC5nZXRTdHJpbmcoInBhdGgiKTsKLQkJCQkJU3RyaW5nIGNvbnRleHQgPSBtb2QuZ2V0U3RyaW5nKCJjb250ZXh0Iik7Ci0JCQkJCU1vZHVsZSBtb2R1bGUgPSBuZXcgTW9kdWxlKG5hbWUsIGlzU3RhdGljLCBjb250ZXh0LCBwYXRoKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJbW9kdWxlcyA9IG5ldyBNb2R1bGVbbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShtb2R1bGVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JcHVibGljIE1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODZkNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JLyoqCi0JICogQ29uZmlnIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09ORklHID0gMDsKLQkvKioKLQkgKiBXYXJuaW5nIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDE7Ci0JLyoqCi0JICogU2V2ZXJlIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQkvKioKLQkgKiBGaW5lc3QgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hJTkcgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgU3RyaW5nCi0JICogQHBhcmFtIHQgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAoIVByZXZpZXdTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKFByZXZpZXdTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1dUUEVycm9yUGFnZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvV1RQRXJyb3JQYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjc5ZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvV1RQRXJyb3JQYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwRmllbGRzOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyLkFic3RyYWN0SHR0cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLm1vcnRiYXkudXRpbC5CeXRlQXJyYXlJU084ODU5V3JpdGVyOwotaW1wb3J0IG9yZy5tb3J0YmF5LnV0aWwuU3RyaW5nVXRpbDsKLQotcHVibGljIGNsYXNzIFdUUEVycm9yUGFnZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEh0dHBIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZShTdHJpbmcgcGF0aEluQ29udGV4dCwgU3RyaW5nIHBhdGhQYXJhbXMsIEh0dHBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKEh0dHBGaWVsZHMuX19UZXh0SHRtbCk7Ci0JCUJ5dGVBcnJheUlTTzg4NTlXcml0ZXIgd3JpdGVyID0gbmV3IEJ5dGVBcnJheUlTTzg4NTlXcml0ZXIoMjA0OCk7Ci0JCXdyaXRlRXJyb3JQYWdlKHJlcXVlc3QsIHdyaXRlciwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFJlYXNvbigpKTsKLQkJCi0JCS8vIHdvcmthcm91bmQgZm9yIElFLCB3aGljaCBvdmVycmlkZXMgNDA0IGVycm9ycyB0byBwcmVzZW50IGl0cyBvd24gcGFnZQotCQlpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gNDA0KQotCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMCwgIk9LIik7IAotCQkKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCXJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgod3JpdGVyLnNpemUoKSk7Ci0JCXdyaXRlci53cml0ZVRvKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJd3JpdGVyLmRlc3Ryb3koKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUVycm9yUGFnZShIdHRwUmVxdWVzdCByZXF1ZXN0LCBXcml0ZXIgd3JpdGVyLCBpbnQgY29kZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gVVJMRGVjb2Rlci5kZWNvZGUobWVzc2FnZSwgIlVURi04Iik7Ci0JCQltZXNzYWdlID0gU3RyaW5nVXRpbC5yZXBsYWNlKG1lc3NhZ2UsICI8IiwgIiZsdDsiKTsKLQkJCW1lc3NhZ2UgPSBTdHJpbmdVdGlsLnJlcGxhY2UobWVzc2FnZSwgIj4iLCAiJmd0OyIpOwotCQl9Ci0JCVN0cmluZyB1cmkgPSByZXF1ZXN0LmdldFBhdGgoKTsKLQkJdXJpID0gU3RyaW5nVXRpbC5yZXBsYWNlKHVyaSwgIjwiLCAiJmx0OyIpOwotCQl1cmkgPSBTdHJpbmdVdGlsLnJlcGxhY2UodXJpLCAiPiIsICImZ3Q7Iik7Ci0JCXdyaXRlci53cml0ZSgiPGh0bWw+XG48aGVhZD5cbjx0aXRsZT5FcnJvciAiKTsKLQkJd3JpdGVyLndyaXRlKEludGVnZXIudG9TdHJpbmcoY29kZSkpOwotCQl3cml0ZXIud3JpdGUoJyAnKTsKLQkJd3JpdGVyLndyaXRlKG1lc3NhZ2UpOwotCQl3cml0ZXIud3JpdGUoIjwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbjxoMj5IVFRQIEVSUk9SOiAiKTsKLQkJd3JpdGVyLndyaXRlKEludGVnZXIudG9TdHJpbmcoY29kZSkpOwotCQl3cml0ZXIud3JpdGUoIjwvaDI+PHByZT4iKTsKLQkJd3JpdGVyLndyaXRlKG1lc3NhZ2UpOwotCQl3cml0ZXIud3JpdGUoIjwvcHJlPlxuIik7Ci0JCXdyaXRlci53cml0ZSgiPHA+UmVxdWVzdFVSST0iKTsKLQkJd3JpdGVyLndyaXRlKHVyaSk7Ci0JCXdyaXRlci53cml0ZSgiPC9wPiIpOwotCQl3cml0ZXIud3JpdGUoIlxuPC9ib2R5PlxuPC9odG1sPlxuIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzEzNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCi0JICogYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihzdHJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGUuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJcmV0dXJuIFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QoaW4pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5YmQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVydWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE0YzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXNlcnZlcnVpLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aV8zLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1YzVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2RlYnVnPXRydWUKLQotIyBMb2FkaW5nIG9mIGV4dGVuc2lvbiBwb2ludHMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvZXh0ZW5zaW9uX3BvaW50PWZhbHNlCi0KLSMgUGVyZm9ybWFuY2Ugb2YgbG9hZGluZyBhbmQgY2FsbGluZyBkZWxlZ2F0ZXMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGVyZm9ybWFuY2U9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZWJhNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkMTZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTU6MjYgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGY3NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuYnJvd3NlcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUwNGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwotc291cmNlLi4gPSBzZXJ2ZXJ1aS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2RlYnVnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNGQ3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBkMzgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMzM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHVibGlzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODI3YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBhYzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcnVuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3J1bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjQxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcnVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfc3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjE2ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfc3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NTBiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E5NTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvcnVuX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDdkOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvcnVuX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmNmIzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDcwMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViYWNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZkMTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjY0OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcnNfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmFiZmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcnNfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjljM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1NjA5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDliMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyMmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkOTA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3J1bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzYyZTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M1ZmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvY2xlYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc1ZWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRjZjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGM4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcnVuX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyMmE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY1N2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZmVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZmY2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIzMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTRkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDM4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzMzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU5YTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYWM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3J1bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9ydW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvY2xlYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjMwYTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY1MGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTk1MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkN2Q5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGY2YjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwNzAxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWJhY2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmQxMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiNjQ4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyc192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcnNfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWJmYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyc192aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19jYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE1Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19jYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fc291bmQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX3NvdW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkODU1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fc291bmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbWlzc2luZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlZjRjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX25vbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbm9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDI3NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbm9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU1ZjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjM5NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I0YzE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTliODQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2VuYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTAwZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcmVwYWlyX2NvbmZpZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcmVwYWlyX2NvbmZpZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjkwZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3JlcGFpcl9jb25maWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzcwMDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfZGVidWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX2RlYnVnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMTc3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX3Byb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2UyNTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcxLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNjNhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2JiZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTUxZTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmczLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMzYjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmM1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMzYjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmczLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmczLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2YzU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RhcnRlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmUwNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3N0YXRlX3N0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3N0YXRlX3N0b3BwZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3N0YXRlX3N0b3BwZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJiZTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdG9wcGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMGY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9kZWZhdWx0X3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9kZWZhdWx0X3NlcnZlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThkNTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYWQyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL2ltcG9ydF9jb25maWd1cmF0aW9uX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1NjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3RfY2xpZW50X3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9jbGllbnRfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5Nzg4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9jbGllbnRfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X3NlcnZlcl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3Rfc2VydmVyX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjFiNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3Rfc2VydmVyX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzE3NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9U2VydmVyIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRFZGl0b3JQYWdlcz1FZGl0b3IgUGFnZXMKLWV4dGVuc2lvblBvaW50RWRpdG9yUGFnZVNlY3Rpb25zPUVkaXRvciBQYWdlIFNlY3Rpb25zCi1leHRlbnNpb25Qb2ludEVkaXRvckFjdGlvbnM9RWRpdG9yIEFjdGlvbnMKLWV4dGVuc2lvblBvaW50U2VydmVySW1hZ2VzPVNlcnZlciBJbWFnZXMKLWV4dGVuc2lvblBvaW50V2l6YXJkRnJhZ21lbnRzPVdpemFyZCBGcmFnbWVudHMKLWV4dGVuc2lvblBvaW50SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyPUluaXRpYWwgU2VsZWN0aW9uIFByb3ZpZGVyCi1leHRlbnNpb25Qb2ludEF1ZGlvPUF1ZGlvCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFdpemFyZHMgYW5kIFZpZXdzIC0tLS0tLS0tLS0tLS0tLQotCi1jYXRlZ29yeT1TZXJ2ZXIKLWNvbnRleHQ9SW4gU2VydmVycyBWaWV3Ci1uZXdTZXJ2ZXI9U2VydmVyCi1uZXdTZXJ2ZXJEZXNjcmlwdGlvbj1EZWZpbmUgYSBuZXcgc2VydmVyCi0KLXZpZXdTZXJ2ZXJzPVNlcnZlcnMKLQotIyAtLS0tLS0tLS0tLS0tLS0gQWN0aW9uIFNldHMgKHRvb2xiYXIgaWNvbiBncm91cHMpIC0tLS0tLS0tLS0tLS0tLQotCi0jIFNlcnZlcnMgYWN0aW9uIHNldAotYWN0aW9uU2V0VGl0bGU9U2VydmVyCi1hY3Rpb25TZXROZXdTZXJ2ZXI9Q3JlYXRlIFNlcnZlcgotCi0jIFJ1biBvbiBTZXJ2ZXIgYWN0aW9ucwotYWN0aW9uUnVuT25TZXJ2ZXI9UnVuIG9uIFNlcnZlcgotYWN0aW9uUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbj1SdW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9uIGEgc2VydmVyCi1hY3Rpb25EZWJ1Z09uU2VydmVyPURlYnVnIG9uIFNlcnZlcgotYWN0aW9uRGVidWdPblNlcnZlckRlc2NyaXB0aW9uPURlYnVnIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvbiBhIHNlcnZlcgotYWN0aW9uUHVibGlzaD1QdWJsaXNoCi1hY3Rpb25QdWJsaXNoRGVzY3JpcHRpb249UHVibGlzaCB0byBzZXJ2ZXIKLWFjdGlvblJ1bj1SdW4KLWFjdGlvblJ1bkRlc2NyaXB0aW9uPVJ1biBzZXJ2ZXIKLWFjdGlvbkRlYnVnPURlYnVnCi1hY3Rpb25EZWJ1Z0Rlc2NyaXB0aW9uPURlYnVnIHNlcnZlcgotYWN0aW9uUHJvZmlsZU9uU2VydmVyPVByb2ZpbGUgb24gU2VydmVyCi1hY3Rpb25TdG9wPVN0b3AKLWFjdGlvblN0b3BEZXNjcmlwdGlvbj1TdG9wIHRoZSBzZXJ2ZXIKLQotIyAtLS0tLS0tLS0tLS0tLS0gUHJlZmVyZW5jZXMgYW5kIFByb3BlcnR5IHBhZ2VzIC0tLS0tLS0tLS0tLS0tLQotCi1wcmVmZXJlbmNlU2VydmVyc1RpdGxlPVNlcnZlcgotcHJlZmVyZW5jZUxhdW5jaGluZ1RpdGxlPUxhdW5jaGluZwotcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGU9UnVudGltZSBFbnZpcm9ubWVudHMKLXByZWZlcmVuY2VTZXJ2ZXJLZXl3b3Jkcz1zZXJ2ZXJzIHJ1bnRpbWUgZW52aXJvbm1lbnQgYnVpbGQgaW5zdGFsbGVkIHB1Ymxpc2hpbmcgZGVwbG95IGFzc2VtYmx5IGxhdW5jaGluZyBydW5uaW5nIGRlYnVnZ2luZyBwcm9maWxpbmcKLQotcHJvcGVydGllc1NlcnZlcj1TZXJ2ZXIKLXByb3BlcnRpZXNTZXJ2ZXJJbmZvPUdlbmVyYWwKLXByb3BlcnRpZXNNb25pdG9yPU1vbml0b3JpbmcKLQotcnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uPVJ1biBvbiBTZXJ2ZXIKLWxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZU5hbWU9UnVuIG9uIFNlcnZlcgotbGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlRGVzY3JpcHRpb249UnVucyBhcHBsaWNhdGlvbnMgb24gdGhlIHNlcnZlcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBFZGl0b3IgLS0tLS0tLS0tLS0tLS0tCi0KLXNlcnZlckVkaXRvcj1TZXJ2ZXIgRWRpdG9yCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2U9T3ZlcnZpZXcKLQotIyAtLS0tLS0tLS0tLS0tLS0gQXVkaW8gLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVuc2lvblBvaW50QXVkaW89QXVkaW8KLQotYXVkaW9QcmVmZXJlbmNlVGl0bGU9QXVkaW8KLXByZWZlcmVuY2VBdWRpb0tleXdvcmRzPXNvdW5kIHZvbHVtZQotCi1sYXVuY2hhYmxlV2ViQnJvd3Nlcj1XZWIgYnJvd3NlcgotbGF1bmNoYWJsZVdlYkJyb3dzZXJEZXNjcmlwdGlvbj1PcGVuIHRoZSBSZXNvdXJjZSBpbiBhIFdlYiBCcm93c2VyCi0KLWF1ZGlvQ2F0ZWdvcnlTZXJ2ZXI9U2VydmVyCi1hdWRpb1NlcnZlclN0YXJ0ZWQ9U2VydmVyIFN0YXJ0ZWQKLWF1ZGlvU2VydmVyU3RvcHBlZD1TZXJ2ZXIgU3RvcHBlZAotCi1hdWRpb0NhdGVnb3J5UHVibGlzaD1QdWJsaXNoaW5nCi1hdWRpb1B1Ymxpc2hGaW5pc2hlZD1QdWJsaXNoIEZpbmlzaGVkCi0KLSMgLS0tLS0tLS0tLS0tLS0tIE90aGVyIC0tLS0tLS0tLS0tLS0tLQotCi1tb25pdG9yTGFiZWw9VENQL0lQIG1vbml0b3IKLW1vbml0b3JEZXNjcmlwdGlvbj1Vc2VzIHRoZSBpbnRlcm5hbCBUQ1AvSVAgbW9uaXRvciB0byBtb25pdG9yIHNlcnZlciByZXF1ZXN0cy4KLQotbW9kdWxlUHJvamVjdERlY29yYXRvckxhYmVsPU1vZHVsZSBQcm9qZWN0Ci1tb2R1bGVQcm9qZWN0RGVjb3JhdG9yRGVzY3JpcHRpb249RGVjb3JhdGVzIHNlcnZlciBtb2R1bGVzIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIHByb2plY3QgdGhhdCB0aGV5IGNvbWUgZnJvbQotCi0jIC0tLS0tLS0tLS0tLS0tLSBBY3Rpb24gU2V0cyAodG9vbGJhciBpY29uIGdyb3VwcykgLS0tLS0tLS0tLS0tLS0tCi0KLSMgV2ViIEJyb3dzZXIgYWN0aW9uIHNldAotYWN0aW9uU2V0V2ViQnJvd3NlclRpdGxlPVdlYiBCcm93c2VyCi1hY3Rpb25TZXRPcGVuV2ViQnJvd3Nlcj1PcGVuIFdlYiBCcm93c2VyCi1hY3Rpb25TZXRTd2l0Y2hCcm93c2VyPVdlYiBCcm93c2VyCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFByZWZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLQotCi0jIE5hbWUgb2YgdGhlIHByZWZlcmVuY2UgcGFnZXMKLXByZWZlcmVuY2VJbnRlcm5ldFRpdGxlPUludGVybmV0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTY0N2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvclBhZ2VzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRFZGl0b3JQYWdlcyIgc2NoZW1hPSJzY2hlbWEvZWRpdG9yUGFnZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JQYWdlU2VjdGlvbnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludEVkaXRvclBhZ2VTZWN0aW9ucyIgc2NoZW1hPSJzY2hlbWEvZWRpdG9yUGFnZVNlY3Rpb25zLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdG9yQWN0aW9ucyIgbmFtZT0iJWV4dGVuc2lvblBvaW50RWRpdG9yQWN0aW9ucyIgc2NoZW1hPSJzY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZlckltYWdlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVySW1hZ2VzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJJbWFnZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3aXphcmRGcmFnbWVudHMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFdpemFyZEZyYWdtZW50cyIgc2NoZW1hPSJzY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL2luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImF1ZGlvIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRBdWRpbyIgc2NoZW1hPSJzY2hlbWEvYXVkaW8uZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJUb29sVGlwIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJUb29sVGlwIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJUb29sVGlwLmV4c2QiLz4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIDxjYXRlZ29yeQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgIG5hbWU9IiVjYXRlZ29yeSIvPgotCi0gIDx3aXphcmQKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm5ldy5zZXJ2ZXIiCi0gICAgICBuYW1lPSIlbmV3U2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk5ld1NlcnZlcldpemFyZCIKLSAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgaWNvbj0iaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYiPgotICAgIDxkZXNjcmlwdGlvbj4lbmV3U2VydmVyRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8L3dpemFyZD4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+IAotICA8Y2F0ZWdvcnkKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBuYW1lPSIlY2F0ZWdvcnkiLz4KLQotICA8dmlldwotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3IgotICAgIG5hbWU9IiV2aWV3U2VydmVycyIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyc1ZpZXciCi0gICAgaWNvbj0iaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiPgotICAgIDx2aWV3Ci0gICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdWaWV3IgotICAgICAgcmVsYXRpb25zaGlwPSJzdGFjayIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3Ij4KLSAgICA8L3ZpZXc+Ci0gIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZVNlcnZlcnNUaXRsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaGluZy5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZUxhdW5jaGluZ1RpdGxlIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkxhdW5jaGluZ1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucnVudGltZS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGUiCi0gICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuUnVudGltZVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5hdWRpby5wcmVmZXJlbmNlUGFnZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlYXVkaW9QcmVmZXJlbmNlVGl0bGUiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW8uQXVkaW9QcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5hdWRpby5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VTZXJ2ZXJLZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VBdWRpb0tleXdvcmRzIgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmF1ZGlvLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvciIKLSAgICBuYW1lPSIlc2VydmVyRWRpdG9yIgotICAgIGljb249Imljb25zL29iajE2L3NlcnZlci5naWYiCi0gICAgZXh0ZW5zaW9ucz0ic2VydmVyIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3IiCi0gICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzIj4KLSAgPGZhY3RvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvcklucHV0RmFjdG9yeSIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb2plY3QucHJvcGVydGllcyIKLSAgICBuYW1lPSIlcHJvcGVydGllc1NlcnZlciIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Qcm9qZWN0UHJvcGVydHlQYWdlIj4KLSAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgIDxhbmQ+Ci0gICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgPC9hbmQ+Ci0gICAgIDwvZW5hYmxlZFdoZW4+Ci0gIDwvcGFnZT4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0aWVzIgotICAgIG5hbWU9IiVwcm9wZXJ0aWVzU2VydmVySW5mbyIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVBhZ2UiPgotICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgPGFuZD4KLSAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciIvPgotICAgICAgIDwvYW5kPgotICAgICA8L2VuYWJsZWRXaGVuPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcy5tb25pdG9yIgotICAgIG5hbWU9IiVwcm9wZXJ0aWVzTW9uaXRvciIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9uaXRvclByb3BlcnR5UGFnZSI+Ci0gICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICA8YW5kPgotICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIi8+Ci0gICAgICAgPC9hbmQ+Ci0gICAgIDwvZW5hYmxlZFdoZW4+Ci0gIDwvcGFnZT4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgPGFjdGlvblNldAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm5ldy5hY3Rpb25TZXQiCi0gICAgbGFiZWw9IiVhY3Rpb25TZXRUaXRsZSIKLSAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgPGFjdGlvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYWN0aW9uLm5ldy5zZXJ2ZXIiCi0gICAgICB0b29sYmFyUGF0aD0ic2VydmVycyIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TmV3U2VydmVyIgotICAgICAgdG9vbHRpcD0iJWFjdGlvblNldE5ld1NlcnZlciIKLSAgICAgIGljb249Imljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdTZXJ2ZXJBY3Rpb24iLz4KLSAgPC9hY3Rpb25TZXQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoU2hvcnRjdXRzIj4KLSAgIDxzaG9ydGN1dAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQiCi0gICAgICAgICBsYWJlbD0iJWFjdGlvblJ1bk9uU2VydmVyIgotICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgICAgbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiCi0gICAgICAgICBwYXRoPSJhYSIKLSAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJMYXVuY2hTaG9ydGN1dCI+Ci0gICAgICA8Y29udGV4dHVhbExhdW5jaD4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxjb3VudCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgIDxpdGVyYXRlPgotICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgIDxjb250ZXh0TGFiZWwKLSAgICAgICAgICAgbW9kZT0icnVuIgotICAgICAgICAgICBsYWJlbD0iJWFjdGlvblJ1bk9uU2VydmVyIi8+Ci0gICAgICAgIDxjb250ZXh0TGFiZWwKLSAgICAgICAgICAgbW9kZT0iZGVidWciCi0gICAgICAgICAgIGxhYmVsPSIlYWN0aW9uRGVidWdPblNlcnZlciIvPgotICAgICAgICA8Y29udGV4dExhYmVsCi0gICAgICAgICAgIG1vZGU9InByb2ZpbGUiCi0gICAgICAgICAgIGxhYmVsPSIlYWN0aW9uUHJvZmlsZU9uU2VydmVyIi8+Ci0gICAgICA8L2NvbnRleHR1YWxMYXVuY2g+Ci0gICAgICA8Y29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotICAgICAgPC9jb25maWd1cmF0aW9uVHlwZT4KLSAgIDwvc2hvcnRjdXQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9ImlzUnVubmFibGUiCi0gICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICBwcm9wZXJ0aWVzPSJzZXJ2ZXJUeXBlIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+Ci0gICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9InNlcnZlclR5cGUiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+Ci0gICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9Im1vZHVsZVR5cGUiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KLSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgcHJvcGVydGllcz0ibW9kdWxlVHlwZSIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KLSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgcHJvcGVydGllcz0ibW9kdWxlVmVyc2lvbiIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICBwcm9wZXJ0aWVzPSJtb2R1bGVWZXJzaW9uIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZXMiPgotICAgIDxwYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXciCi0gICAgICBvcmRlcj0iLTEwMDAwIgotICAgICAgbmFtZT0iJXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZSIKLSAgICAgIHR5cGVJZHM9IioiCi0gICAgICBpbnNlcnRpb25JZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQsIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LnJpZ2h0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLk92ZXJ2aWV3RWRpdG9yUGFydCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5Ci0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gIDxjbGllbnQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53ZWIiCi0gICAgbmFtZT0iJWxhdW5jaGFibGVXZWJCcm93c2VyIgotICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZVdlYkJyb3dzZXJEZXNjcmlwdGlvbiIKLSAgICBsYXVuY2hhYmxlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5XZWJMYXVuY2hhYmxlQ2xpZW50Ii8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU3RhcnR1cCI+Ci0gIDxzdGFydHVwCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc3RhcnR1cCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TdGFydHVwIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5hdWRpbyI+Ci0gIDxjYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCi0gICAgbmFtZT0iJWF1ZGlvQ2F0ZWdvcnlTZXJ2ZXIiLz4KLSAgPHNvdW5kIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0YXJ0IgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlciIKLSAgICBuYW1lPSIlYXVkaW9TZXJ2ZXJTdGFydGVkIi8+Ci0gIDxzb3VuZCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXJTdG9wIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlciIKLSAgICBuYW1lPSIlYXVkaW9TZXJ2ZXJTdG9wcGVkIi8+Ci0gIDxjYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5wdWJsaXNoIgotICAgIG5hbWU9IiVhdWRpb0NhdGVnb3J5UHVibGlzaCIvPgotICA8c291bmQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQucHVibGlzaEZpbmlzaGVkIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2giCi0gICAgbmFtZT0iJWF1ZGlvUHVibGlzaEZpbmlzaGVkIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU2VydmVyTW9uaXRvcnMiPgotICA8bW9uaXRvcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm1vbml0b3IiCi0gICAgbmFtZT0iJW1vbml0b3JMYWJlbCIKLSAgICBkZXNjcmlwdGlvbj0iJW1vbml0b3JEZXNjcmlwdGlvbiIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWZhdWx0TW9uaXRvckRlbGVnYXRlIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gIDxhY3Rpb25TZXQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyLmFjdGlvblNldCIKLSAgICBsYWJlbD0iJWFjdGlvblNldFdlYkJyb3dzZXJUaXRsZSIKLSAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgPGFjdGlvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5hY3Rpb24ub3BlbiIKLSAgICAgIHRvb2xiYXJQYXRoPSJicm93c2VyIgotICAgICAgbGFiZWw9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIGljb249Imljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiIvPgotICAgIDxhY3Rpb24KLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuYWN0aW9uLnN3aXRjaCIKLSAgICAgIG1lbnViYXJQYXRoPSJ3aW5kb3cvYnJvd3NlciIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0U3dpdGNoQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRTd2l0Y2hCcm93c2VyIgotICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uIi8+Ci0gIDwvYWN0aW9uU2V0PgotPC9leHRlbnNpb24+Ci0KLTwhLS0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwcyI+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKLSAgICAgaW1hZ2U9Imljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmIgotICAgICBtb2RlPSJydW4iCi0gICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIgotICAgICB0aXRsZT0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC50aXRsZSI+Ci0gIDwvbGF1bmNoR3JvdXA+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5idWlsZGVyIgotICAgICBpbWFnZT0iaWNvbnMvZnVsbC9vYmoxNi9leHRlcm5hbF90b29scy5naWYiCi0gICAgIHB1YmxpYz0iZmFsc2UiCi0gICAgIG1vZGU9InJ1biIKLSAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAuYnVpbGRlciI+Ci0gICA8L2xhdW5jaEdyb3VwPgotPC9leHRlbnNpb24+Ci0tLT4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICA8Y2F0ZWdvcnkKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBuYW1lPSIlY2F0ZWdvcnkiCi0gICAgZGVzY3JpcHRpb249IiVjYXRlZ29yeSIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LnJ1biIKLSAgICBuYW1lPSIlYWN0aW9uUnVuT25TZXJ2ZXIiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uIgotICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNhdGVnb3J5LnJ1biIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LmRlYnVnIgotICAgIG5hbWU9IiVhY3Rpb25EZWJ1Z09uU2VydmVyIgotICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uRGVidWdPblNlcnZlckRlc2NyaXB0aW9uIgotICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNhdGVnb3J5LnJ1biIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJ1biIKLSAgICBuYW1lPSIlYWN0aW9uUnVuIgotICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uUnVuRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRlYnVnIgotICAgIG5hbWU9IiVhY3Rpb25EZWJ1ZyIKLSAgICBkZXNjcmlwdGlvbj0iJWFjdGlvbkRlYnVnRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnN0b3AiCi0gICAgbmFtZT0iJWFjdGlvblN0b3AiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25TdG9wRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giCi0gICAgbmFtZT0iJWFjdGlvblB1Ymxpc2giCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25QdWJsaXNoRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLSAgPGNvbnRleHQKLSAgICBpZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIG5hbWU9IiVjb250ZXh0IgotICAgIGRlc2NyaXB0aW9uPSIlY29udGV4dCIKLSAgICBwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93Ij4KLSAgPC9jb250ZXh0PgotPC9leHRlbnNpb24+Ci0KLTwhLS0gY29tbWFuZHMgYW5kIHRoZWlyIGJpbmRpbmdzCi1OT1RFOgotTTEgPSBDVFJML0NPTU1BTkQKLU0yID0gU0hJRlQKLU0zID0gQUxUCi1NNCA9IFBsYXRmb3JtLXNwZWNpZmljIGZvdXJ0aCBrZXkKLS0tPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0zK00yK1ggUiIKLSAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5ydW4iCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMytNMitEIFIiCi0gICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSIKLSAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQuZGVidWciCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytSIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytEIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kZWJ1ZyIKLSAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0xK00zK1MiCi0gICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5zZXJ2ZXJWaWV3U2NvcGUiCi0gICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnN0b3AiCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytQIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wdWJsaXNoIgotICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICA8aW1hZ2UKLSAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2ViIgotICAgICB0eXBlSWRzPSJ3c3Qud2ViIgotICAgICBpY29uPSJpY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KLSAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKLSAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdGlvbi5tYXJrZXIiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgPGRlY29yYXRvcgotICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1vZHVsZUxhYmVsRGVjb3JhdG9yIgotICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kZWNvcmF0b3IiCi0gICAgIGxhYmVsPSIlbW9kdWxlUHJvamVjdERlY29yYXRvckxhYmVsIgotICAgICBsaWdodHdlaWdodD0iZmFsc2UiCi0gICAgIHN0YXRlPSJmYWxzZSI+Ci0gICAgPGRlc2NyaXB0aW9uPiVtb2R1bGVQcm9qZWN0RGVjb3JhdG9yRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxlbmFibGVtZW50PgotICAgICAgPG9yPgotICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUiLz4KLSAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciIvPgotICAgICAgPC9vcj4KLSAgICA8L2VuYWJsZW1lbnQ+Ci0gIDwvZGVjb3JhdG9yPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICBkZWxlZ2F0ZU5hbWU9IiVsYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVOYW1lIgotICAgIGRlbGVnYXRlRGVzY3JpcHRpb249IiVsYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVEZXNjcmlwdGlvbiIKLSAgICBwdWJsaWM9ImZhbHNlIgotICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIKLSAgICBuYW1lPSIlcnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgIGljb249Imljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYiPgotICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJUb29sVGlwIj4KLSAgPHNlcnZlclRvb2xUaXAKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5HZW5lcmFsVG9vbFRpcCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5HZW5lcmFsVG9vbFRpcCIKLSAgICBzZXJ2ZXJUeXBlcz0iKiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5sYXVuY2hhYmxlQWRhcHRlcnMiPgotICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW4kRGVmYXVsdExhdW5jaGFibGVBZGFwdGVyIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hhYmxlLmFkYXB0ZXIuZGVmYXVsdCIKLSAgICAgICAgcHJpb3JpdHk9Ii05OTk5OTkiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvYXVkaW8uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvYXVkaW8uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5ZWRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2F1ZGlvLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImF1ZGlvIiBuYW1lPSJBdWRpbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBzb3J0IHJ1bnRpbWUgdHlwZXMsIHJ1bnRpbWVzLCBzZXJ2ZXIgdHlwZXMsIGFuZCBzZXJ2ZXJzLiBUaGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kIGlzIGFsd2F5cyB1c2VkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkgb25lIGNvbXBhcmF0b3IgZXhpc3RzIGluIGFuIGluc3RhbGxhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic291bmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgY2F0ZWdvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic291bmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzb3VuZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY2F0ZWdvcnkgaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHNvdW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzb3J0ZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc29ydGVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2ltYWdlCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZS5NeUNvbXBhcmF0b3ImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNmY2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImVkaXRvckFjdGlvbnMiIG5hbWU9IkVkaXRvciBBY3Rpb25zIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhY3Rpb25zIHRvIHRoZSB0b29sYmFyIG9mIGFuIGV4aXN0aW5nIHNlcnZlciBlZGl0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0b3JBY3Rpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRvckFjdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGFjdGlvbg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzLiBNYXkgaW5jbHVkZSB3aWxkY2FyZHMgKCopIGF0IHRoZSBlbmQgb2YgYW4gaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBhY3Rpb24NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIGFuIGFic29sdXRlIG9yZGVyaW5nIG9mIHRoZSBhY3Rpb24gcmVsYXRpdmUgdG8gb3RoZXIgYWN0aW9ucw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBhY3Rpb24gZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yQWN0aW9ucyZxdW90OyZndDsNCi0gICAgICAmbHQ7cGFnZQ0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgb3JkZXI9JnF1b3Q7MjAmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVlZGl0b3JBY3Rpb24mcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yQWN0aW9uJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlU2VjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYThiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImVkaXRvclBhZ2VTZWN0aW9ucyIgbmFtZT0iRWRpdG9yIFBhZ2UgU2VjdGlvbnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGFkZGl0aW9uYWwgc2VjdGlvbnMgaW50byBhbiBleGlzdGluZyBzZXJ2ZXIgZWRpdG9yIHBhZ2UgdGhhdCBjb250YWlucyBpbnNlcnRpb24gcG9pbnRzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VjdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VjdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzZWN0aW9uDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb24mbHQ7L3NhbXAmZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JTZWN0aW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMuIE1heSBpbmNsdWRlIHdpbGRjYXJkcyAoKikgYXQgdGhlIGVuZCBvZiBhbiBpZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIGFuIGFic29sdXRlIG9yZGVyaW5nIG9mIHRoZSBzZWN0aW9uIHJlbGF0aXZlIHRvIG90aGVyIHNlY3Rpb25zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydGlvbklkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBlZGl0b3IgcGFnZSBpbnNlcnRpb24gaWQgdGhhdCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIGluc2VydGVkIGludG8NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBlZGl0b3IgcGFnZSBzZWN0aW9uIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlU2VjdGlvbnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3NlY3Rpb24NCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90Ow0KLSAgICAgICAgICAgIG9yZGVyPSZxdW90OzAmcXVvdDsNCi0gICAgICAgICAgICBpbnNlcnRpb25JZD0mcXVvdDtjb20uZXhhbXBsZS5sZWZ0JnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS4qJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZUVkaXRvclNlY3Rpb25GYWN0b3J5JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnlEZWxlZ2F0ZSZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2E5ZWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJlZGl0b3JQYWdlcyIgbmFtZT0iRWRpdG9yIFBhZ2VzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhbiBhZGRpdGlvbmFsIHBhZ2UgdG8gYSBzZXJ2ZXIgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFnZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQmbHQ7L3NhbXAmZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzLiBNYXkgaW5jbHVkZSB3aWxkY2FyZHMgKCopIGF0IHRoZSBlbmQgb2YgYW4gaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBvcmRlcmluZyBvZiB0aGUgcGFnZSByZWxhdGl2ZSB0byBvdGhlciBwYWdlcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRpb25JZHMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbnNlcnRpb24gaWRzIHRoYXQgYWxsb3cgc2VjdGlvbnMgdG8gYmUgcGx1Z2dlZCBpbg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBwYWdlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwYWdlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCi0gICAgICAgICAgICBvcmRlcj0mcXVvdDsyMCZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWVkaXRvclBhZ2UmcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yRmFjdG9yeSZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeURlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5YmNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIiIG5hbWU9IkluaXRpYWwgU2VsZWN0aW9uIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGluaXRpYWxseSBzZWxlY3QgcnVudGltZSB0eXBlcywgcnVudGltZXMsIHNlcnZlciB0eXBlcywgYW5kIHNlcnZlcnMgaW4gdGhlIHNlcnZlciB3aXphcmRzLiBUaGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kIGlzIGFsd2F5cyB1c2VkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkgb25lIGluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBleGlzdHMgaW4gYW4gaW5zdGFsbGF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWxlY3Rpb25Qcm92aWRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvblByb3ZpZGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5Jbml0aWFsU2VsZWN0aW9uUHJvdmlkZXImbHQ7L3NhbXAmZ3Q7LiBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2VsZWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLk15U2VsZWN0aW9uUHJvdmlkZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJJbWFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhZTBkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9InNlcnZlckltYWdlcyIgbmFtZT0iU2VydmVyIEltYWdlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBwcm92aWRlIGFuIGltYWdlIGZvciBhIHJ1bnRpbWUsIHNlcnZlciwgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3IgbW9kdWxlIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbWFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW1hZ2UiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbWFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgYnVuZGxlLXJlbGF0aXZlIHBhdGggdG8gdGhlIGljb24gaW1hZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lLCBzZXJ2ZXIsIG9yIG1vZHVsZSB0eXBlIGlkcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc2VydmVyIGltYWdlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2ltYWdlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCi0gICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL29iajE2L3J1bnRpbWUuZ2lmJnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlclRvb2xUaXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyVG9vbFRpcC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTM0OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyVG9vbFRpcC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9InNlcnZlclRvb2xUaXAiIG5hbWU9IlNlcnZlciBUb29sVGlwIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhZGRpdGlvbmFsIHRleHQgd2hlbiB0aGUgbW91c2VvdmVyIGFjdGlvbiBpcyBkZXRlY3RlZAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJUb29sVGlwIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlclRvb2xUaXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFRvb2xUaXAgcHJvdmlkZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwJmx0Oy9zYW1wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlcnZlclRvb2xUaXAiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJUeXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHR5cGUgaWRzIHRoYXQgdXNlIHRoaXMgU2VydmVyVG9vbFRpcAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlclRvb2xUaXAmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2VydmVyVG9vbFRpcAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKLSAgICAgICAgICAgIHNlcnZlclR5cGVzPSZxdW90OyomcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVUb29sVGlwUHJvdmlkZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE4OWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0id2l6YXJkRnJhZ21lbnRzIiBuYW1lPSJXaXphcmQgRnJhZ21lbnRzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBwYWdlcyBvciBsb2dpYyBpbnRvIHdpemFyZHMgZm9yIGEgc3BlY2lmaWMgcnVudGltZSwgc2VydmVyLCBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnJhZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZyYWdtZW50Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQmbHQ7L3NhbXAmZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudCIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSBvciBzZXJ2ZXIgdHlwZSBpZHMgdGhhdCB0aGlzIGZyYWdtZW50IGFwcGxpZXMgdG8NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHdpemFyZCBmcmFnbWVudCBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtmcmFnbWVudA0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVdpemFyZEZyYWdtZW50JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50Jmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVyQWRhcHRlclNpdGVzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ0MmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGV4dGVuc2lvbnM+Ci0gICAgPHNpdGUgdXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9nZXJvbmltby9lY2xpcHNlL3VwZGF0ZXMvIi8+Ci0gICAgPHNpdGUgdXJsPSJodHRwOi8vZG93bmxvYWQuYm91bGRlci5pYm0uY29tL2libWRsL3B1Yi9zb2Z0d2FyZS93ZWJzcGhlcmUvd2FzY2UvdXBkYXRlcy8iLz4KLSAgICA8c2l0ZSB1cmw9Imh0dHA6Ly93d3cucHJhbWF0aS5jb20vZG93bmxvYWRzL2VjbGlwc2UvdXBkYXRlcy8iLz4KLSAgICA8c2l0ZSB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMvIi8+Ci0gICAgPHNpdGUgdXJsPSJodHRwczovL2RldjJkZXZjbHViLmJlYS5jb20vdXBkYXRlcy93bHMtdG9vbHMvZ2FueW1lZGUvIi8+Ci0gICAgPHNpdGUgdXJsPSJodHRwczovL2FqYXguZGV2LmphdmEubmV0L2VjbGlwc2UiLz4KLSAgICA8c2l0ZSB1cmw9Imh0dHBzOi8vd3d3LnNkbi5zYXAuY29tL2Rvd25sb2Fkcy91cGRhdGVzL25ldHdlYXZlci9ud2RzL3NhcG53c2VydmVyLyIvPgotICAgIDxzaXRlIHVybD0iaHR0cDovL3d3dy53ZWJ0aWRlLmNvbS9lY2xpcHNlIi8+Ci08L2V4dGVuc2lvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRmZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0ZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiBBIGZhY2V0IHJ1bnRpbWUgbGFiZWwgcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgotICogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciBpbiB0aGUKLSAqIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIGV4dGVuc2lvbiBwb2ludC4KLSAqLwotcHVibGljIGNsYXNzIEZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmNsYXNzIH07Ci0KLQlwdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0JCXB1YmxpYyBSdW50aW1lTGFiZWxQcm92aWRlcihJUnVudGltZUNvbXBvbmVudCByYykgewotCQkJdGhpcy5yYyA9IHJjOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiByYy5nZXRQcm9wZXJ0eSgidHlwZSIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCUlSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBhZGFwdGFibGU7Ci0JCXJldHVybiBuZXcgUnVudGltZUxhYmVsUHJvdmlkZXIocmMpOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvSVNlcnZlck1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvSVNlcnZlck1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWM5MjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0lTZXJ2ZXJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIGhlbHBlciBpbnRlcmZhY2UgZm9yIG1vZHVsZXMgdGhhdCBhcmUgZGVwbG95ZWQgdG8gYSBzZXJ2ZXIsIGNvbW1vbmx5Ci0gKiB1c2VkIHRvIGhlbHAgYWN0aW9ucyBpbnRlcmFjdCB3aXRoIG1vZHVsZXMgaW4gdGhlIFNlcnZlcnMgdmlldy4KLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlck1vZHVsZSB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbW9kdWxlIGJlbG9uZ3MgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2ZhZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLS8qKgotICogU2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYi4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiB7Ci0JLy8gZmxhZyB0byBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGVuYWJsZSBjb21ibyBpbiBsYXVuY2ggY29uZmlnIGRpYWxvZwotCS8vIGFmdGVyIHRoZSB1c2VyIHJlcXVlc3RzIGEgbGF1bmNoLCB0aGV5IGNhbm5vdCBjaGFuZ2UgaXQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZID0gInJlYWQtb25seSI7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHNlcnZlclR5cGVJZHM7Ci0KLQlwcml2YXRlIENvbWJvIHNlcnZlckNvbWJvOwotCi0JcHJpdmF0ZSBMYWJlbCBydW50aW1lTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBob3N0bmFtZTsKLQotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0KLQkvLyBsaXN0IG9mIHNlcnZlcnMgdGhhdCBhcmUgaW4gY29tYm8KLQlwcml2YXRlIExpc3Q8SVNlcnZlcj4gc2VydmVyczsKLQotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7IioifSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgd2l0aCB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUgaWRzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWRzIGFuIGFycmF5IG9mIHNlcnZlciB0eXBlIGlkcwotCSAqLwotCXB1YmxpYyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKFN0cmluZ1tdIHNlcnZlclR5cGVJZHMpIHsKLQkJdGhpcy5zZXJ2ZXJUeXBlSWRzID0gc2VydmVyVHlwZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy9HcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCS8vZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCS8vY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTGF1bmNoRGVzY3JpcHRpb24pOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hTZXJ2ZXIpOwotCQlzZXJ2ZXJDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZlckNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZXJ2ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlcnZlclNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzZXJ2ZXJDb21ibywgQ29udGV4dElkcy5MQVVOQ0hfQ09ORklHVVJBVElPTl9TRVJWRVJfQ09NQk8pOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaFJ1bnRpbWUpOwotCQlydW50aW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJ1bnRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaEhvc3QpOwotCQlob3N0bmFtZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvLyBpbml0aWFsaXplCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwotCQlpZiAoc2VydmVyczIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IHNlcnZlcnMyW2ldOwotCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIGlzU3VwcG9ydGVkU2VydmVyKHNlcnZlcjIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJCXNlcnZlckNvbWJvLmFkZChzZXJ2ZXIyLmdldE5hbWUoKSk7Ci0JCQkJCXNlcnZlcnMuYWRkKHNlcnZlcjIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNlbGVjdCBmaXJzdCBpdGVtIGluIGxpc3QKLQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKLQotCQloYW5kbGVTZXJ2ZXJTZWxlY3Rpb24oKTsKLQotCQlzZXJ2ZXJDb21iby5mb3JjZUZvY3VzKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZFNlcnZlcihTdHJpbmcgc2VydmVyVHlwZUlkKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlSWRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlSWRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChtYXRjaGVzKHNlcnZlclR5cGVJZCwgc2VydmVyVHlwZUlkc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsIHx8ICIqIi5lcXVhbHMoYSkgfHwgIioiLmVxdWFscyhiKSB8fCBhLnN0YXJ0c1dpdGgoYikgfHwgYi5zdGFydHNXaXRoKGEpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgc2VsZWN0ZWQuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyU2VsZWN0aW9uKCkgewotCQlpZiAoc2VydmVycy5pc0VtcHR5KCkpCi0JCQlzZXJ2ZXIgPSBudWxsOwotCQllbHNlCi0JCQlzZXJ2ZXIgPSBzZXJ2ZXJzLmdldChzZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQlob3N0bmFtZS5zZXRUZXh0KHNlcnZlci5nZXRIb3N0KCkpOwotCQl9IGVsc2UKLQkJCWhvc3RuYW1lLnNldFRleHQoIiIpOwotCQkKLQkJLy8gY2hlY2sgaWYgInJ1bnRpbWUiIHByb3BlcnR5IGlzIHRydWUgb3IgZmFsc2UKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkpCi0JCQlydW50aW1lTGFiZWwuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCWVsc2UKLQkJCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAod2MgIT0gbnVsbCkKLQkJCQkoKFNlcnZlcilzZXJ2ZXIpLnNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3YywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXJTZWxlY3RlZCk7Ci0JCWVsc2UgaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKLQkJZWxzZQotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlpZiAoc2VydmVyQ29tYm8gIT0gbnVsbCkgewkKLQkJCXNlcnZlckNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZiAoc2VydmVyQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJc2VydmVyID0gc2VydmVycy5nZXQoc2VydmVyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJKChTZXJ2ZXIpIHNlcnZlcikuc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24sIG51bGwpOwotCQl9Ci0JCXdjID0gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy9yZW1vdmUgZXJyb3IgbWVzc2FnZSB0aGF0IG90aGVyIGluc3RhbmNlcyBtYXkgaGF2ZSBzZXQKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZyBzZXJ2ZXJJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFNlcnZlci5BVFRSX1NFUlZFUl9JRCwgIiIpOwotCQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgIXNlcnZlcklkLmVxdWFscygiIikpIHsKLQkJCQlzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOwotCQkJCQotCQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgeyAvLyBzZXJ2ZXIgbm8gbG9uZ2VyIGV4aXN0cwkJCQkKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9ySW52YWxpZFNlcnZlcik7Ci0JCQkJCS8vc2VydmVyQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsgIC8vIGFwcGVhcnMgdG8gYmUgYnJva2VuLi4uZG9lc24ndCB3b3JrIHdpdGggcmVhZCBvbmx5PwkJCQkJCQkJCQkJCQotCQkJCQlzZXJ2ZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlzZXJ2ZXJDb21iby5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCQkJc2VydmVyQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQkJLy8gZmxhZyBzaG91bGQgb25seSBiZSBzZXQgaWYgbGF1bmNoIGhhcyBiZWVuIGF0dGVtcHRlZCBvbiB0aGUgY29uZmlnCi0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoUkVBRF9PTkxZLCBmYWxzZSkpCi0JCQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3BlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXIuZ2V0SWQoKSk7Ci0JCWVsc2UKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFNlcnZlci5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZyludWxsKTsKLQkJd2MgPSBjb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbikgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IGxhdW5jaENvbmZpZy5nZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAiIik7Ci0JCQlpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgewotCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihpZCk7Ci0JCQkJaWYgKHNlcnZlcjIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSUNvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA5MzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiBTZXJ2ZXIgVUkgY29yZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlclVJQ29yZSB7Ci0JLyoqCi0JICogQ2Fubm90IGluc3RhbnRpYXRlIFNlcnZlclVJQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIFNlcnZlclVJQ29yZSgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxhYmVsIHByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGFsbCBzZXJ2ZXIKLQkgKiBvYmplY3RzIGluIHRoZSBVSS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGFiZWwgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VydmVyTGFiZWxQcm92aWRlcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjRhMGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTZXJ2ZXIgVUkgdXRpbGl0eSBtZXRob2RzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVUlVdGlsIHsKLQkvKioKLQkgKiBDYW5ub3QgaW5zdGFudGlhdGUgU2VydmVyVUlVdGlsIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgU2VydmVyVUlVdGlsKCkgewotCQkvLyBjYW4ndCBjcmVhdGUKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuIFRoZSBnaXZlbiB0eXBlSWQgYW5kIHZlcnNpb25JZCBhcmUgdXNlZCB0byBmaWx0ZXIKLQkgKiB0aGUgc2V0IG9mIHJ1bnRpbWVzIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgd2l6YXJkCi0JICogQHBhcmFtIHR5cGVJZCBhIG1vZHVsZSB0eXBlIGlkLCBvciBudWxsIGZvciBhbnkgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbklkIGEgbW9kdWxlIHZlcnNpb24sIG9yIG51bGwgZm9yIGFueSB2ZXJzaW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJ1bnRpbWUgd2FzIGNyZWF0ZWQsIG9yCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHZlcnNpb25JZCkgewotCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsIHR5cGVJZCwgdmVyc2lvbklkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuIFRoZSBnaXZlbiB0eXBlSWQsIHZlcnNpb25JZCwgYW5kIHJ1bnRpbWVUeXBlSWQgYXJlCi0JICogdXNlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiBydW50aW1lcyBkaXNwbGF5ZWQuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHdpemFyZAotCSAqIEBwYXJhbSB0eXBlSWQgYSBtb2R1bGUgdHlwZSBpZCwgb3IgbnVsbCBmb3IgYW55IG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uLCBvciBudWxsIGZvciBhbnkgdmVyc2lvbgotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIGEgc2VydmVyIHJ1bnRpbWUgdHlwZSwgb3IgbnVsbCBmb3IgYW55IHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcnVudGltZSB3YXMgY3JlYXRlZCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLnNob3dOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCB0eXBlSWQsIHZlcnNpb25JZCwgcnVudGltZVR5cGVJZCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgc2VydmVyIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgd2l6YXJkCi0JICogQHBhcmFtIHR5cGVJZCBhIG1vZHVsZSB0eXBlIGlkLCBvciBudWxsIGZvciBhbnkgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbklkIGEgbW9kdWxlIHZlcnNpb24sIG9yIG51bGwgZm9yIGFueSB2ZXJzaW9uCi0JICogQHBhcmFtIHNlcnZlclR5cGVJZCBhIHNlcnZlciBydW50aW1lIHR5cGUsIG9yIG51bGwgZm9yIGFueSB0eXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHNlcnZlciB3YXMgY3JlYXRlZCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3U2VydmVyV2l6YXJkKFNoZWxsIHNoZWxsLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdmVyc2lvbklkLCBTdHJpbmcgc2VydmVyVHlwZUlkKSB7Ci0JCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5zaG93TmV3U2VydmVyV2l6YXJkKHNoZWxsLCB0eXBlSWQsIHZlcnNpb25JZCwgc2VydmVyVHlwZUlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjMzMjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLS8qKgotICogIlJ1biBvbiBTZXJ2ZXIiIG1lbnUgYWN0aW9uLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGFuCi0gKiBvYmplY3QsIGFuZCBoYXZlIGF1dG9tYXRpYyBzZXJ2ZXIgY3JlYXRpb24sIGxhdW5jaGluZywgYW5kCi0gKiB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IHRvIGFwcGVhci4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhpcwotICogYWN0aW9uIG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCBvYmplY3QgdGhhdCB0aGUgdXNlciBzZWxlY3RzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUnVuIG9uIFNlcnZlciBhY3Rpb24gZm9yIHJ1biBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIHJ1bgotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMob2JqZWN0LCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFJ1biBvbiBTZXJ2ZXIgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIHJ1bgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEge0BsaW5rIElMYXVuY2hNYW5hZ2VyfSBsYXVuY2ggbW9kZQotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcigpOwotCQkKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnT25TZXJ2ZXIpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfREVCVUdfT05fU0VSVkVSKSk7Ci0JCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKLQkJfSBlbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVPblNlcnZlcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOwotCQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ1RPT0xfUFJPRklMRV9PTl9TRVJWRVIpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOwotCQl9IGVsc2UgewotCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25SdW5PblNlcnZlcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRVRPT0xfUlVOX09OX1NFUlZFUikpOwotCQl9Ci0JCQotCQlkZWxlZ2F0ZSA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCk7Ci0JCWRlbGVnYXRlLnNldExhdW5jaE1vZGUobGF1bmNoTW9kZSk7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpOwotCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWwpOwotCQl9IGVsc2UKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgbnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0YzlkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEFuIGlucHV0IGludG8gYSBzZXJ2ZXIgcGFydCBvciBzZWN0aW9uIGVkaXRvci4KLSAqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBleHRlbmRzIElFZGl0b3JJbnB1dCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRvIGJlIGVkaXRlZC4KLQkgKgotCSAqIEByZXR1cm4gYSB3b3JraW5nIGNvcHkgb2YgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJSZWFkT25seSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvU2VydmVyRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFkMDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci4qOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBzZXJ2ZXIgZWRpdG9yIHdoaWNoIGltcGxlbWVudHMgdGhlIG1vc3QgY29tbW9uIG1ldGhvZHMKLSAqIGZyb20gSUVkaXRvclBhcnQuCi0gKiAKLSAqIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBlYWNoIGVkaXRvciBwYWdlIHdpdGggYW4gZXJyb3IgbWVzc2FnZSB3aGljaAotICogd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHN0YXR1cyBiYXIgb2YgdGhlIGVkaXRvci4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRWRpdG9yUGFydCBleHRlbmRzIEVkaXRvclBhcnQgewotCS8qKgotCSAqIFByb3BlcnR5IGNoYW5nZSBpZCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9FUlJPUiA9IDU7Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPj4gc2VjdGlvblRvSW5zZXJ0aW9uSWQgPSBudWxsOwotCXByaXZhdGUgTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPiBzZWN0aW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQlwcml2YXRlIElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybTsKLQotCS8qKgotCSAqIFRoZSBzZXJ2ZXIgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQotCS8qKgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBlZGl0b3IgcGFydC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2RvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbWFuYWdlZCBmb3JtIHRoYXQgdGhpcyBwYXJ0IGlzIHVzaW5nLgotCSAqIAotCSAqIEBwYXJhbSBtYW5hZ2VkRm9ybSBhIG1hbmFnZWQgZm9ybQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VkRm9ybShJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJdGhpcy5tYW5hZ2VkRm9ybSA9IG1hbmFnZWRGb3JtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoaXMgcGFydCBpcyB1c2luZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiBtYW5hZ2VkIGZvcm0gaGFzIGJlZW4gc2V0LgotCSAqIAotCSAqIEByZXR1cm4gbWFuYWdlZEZvcm0gdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoaXMgcGFydCBpcyB1c2luZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiBubyBtYW5hZ2VkIGZvcm0gaGFzIGJlZW4gc2V0Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCXByb3RlY3RlZCBJTWFuYWdlZEZvcm0gZ2V0TWFuYWdlZEZvcm0oKSB7Ci0JCXJldHVybiBtYW5hZ2VkRm9ybTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvcikgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmVxdWFscyhlcnJvck1lc3NhZ2UpKQotCQkJcmV0dXJuOwotCQkKLQkJZXJyb3JNZXNzYWdlID0gZXJyb3I7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0VSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlcnJvciBtZXNzYWdlIHNob3duIGluIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KLQkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0VSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KLQkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBlcnJvciA9IHNlY3Rpb24uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZXJyb3Igb3Igc3RhdHVzIG1lc3NhZ2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUKLQkgKiBzZXJ2ZXIgcmVzb3VyY2UgaXMgc2F2ZWQuIElmIHRoZXJlIGFyZSBhbnkgZXJyb3IgbWVzc2FnZXMsIHRoZQotCSAqIHVzZXIgd2lsbCBiZSB1bmFibGUgdG8gc2F2ZSB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYSBzZXQgb2Ygc3RhdHVzCi0JICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KLQkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIGdldFNhdmVTdGF0dXMoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQlMaXN0PElTdGF0dXM+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJU3RhdHVzW10gc3RhdHVzID0gc2VjdGlvbi5nZXRTYXZlU3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHN0YXR1cy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKHN0YXR1c1tpXS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spCi0JCQkJCQlsaXN0LmFkZChzdGF0dXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzW3NpemVdOwotCQlsaXN0LnRvQXJyYXkoc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2VjdGlvbnMoKSB7Ci0JCWlmIChzZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4oKTsKLQkJCXNlY3Rpb25Ub0luc2VydGlvbklkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+PigpOwotCQkJU2VydmVyRWRpdG9yIHNlcnZlckVkaXRvciA9IGNvbW1hbmRNYW5hZ2VyLmdldFNlcnZlckVkaXRvcigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBTZXJ2ZXJFZGl0b3JDb3JlLmdldFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5IGZhY3RvcnkgPSAoSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBpbnNlcnRpb25JZCA9IGZhY3RvcnkuZ2V0SW5zZXJ0aW9uSWQoKTsKLQkJCQkKLQkJCQlJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgcGFnZUZhY3RvcnkgPSBzZXJ2ZXJFZGl0b3IuZ2V0UGFnZUZhY3RvcnkodGhpcyk7Ci0JCQkJaWYgKHBhZ2VGYWN0b3J5LnN1cHBvcnRzSW5zZXJ0aW9uSWQoaW5zZXJ0aW9uSWQpKSB7Ci0JCQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBudWxsOwotCQkJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotCQkJCQkJc2VydmVyVHlwZUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkJCQlpZiAoc2VydmVyVHlwZUlkICE9IG51bGwgJiYgZmFjdG9yeS5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKQotCQkJCQkJCSYmIGZhY3Rvcnkuc2hvdWxkQ3JlYXRlU2VjdGlvbihzZXJ2ZXIpKSB7Ci0JCQkJCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZVNlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWN0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlzZWN0aW9uLnNldFNlcnZlckVkaXRvclBhcnQodGhpcyk7Ci0JCQkJCQkJc2VjdGlvbnMuYWRkKHNlY3Rpb24pOwotCQkJCQkJCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gbGlzdCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbGlzdCA9IHNlY3Rpb25Ub0luc2VydGlvbklkLmdldChpbnNlcnRpb25JZCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJfQotCQkJCQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+KCk7Ci0JCQkJCQkJbGlzdC5hZGQoc2VjdGlvbik7Ci0JCQkJCQkJc2VjdGlvblRvSW5zZXJ0aW9uSWQucHV0KGluc2VydGlvbklkLCBsaXN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VjdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlY3Rpb25zKFN0cmluZyBpbnNlcnRpb25JZCkgewotCQlpZiAoaW5zZXJ0aW9uSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJZ2V0U2VjdGlvbnMoKTsKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPigpOwotCQl0cnkgewotCQkJTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPiBzZWN0aW9uczIgPSBzZWN0aW9uVG9JbnNlcnRpb25JZC5nZXQoaW5zZXJ0aW9uSWQpOwotCQkJaWYgKHNlY3Rpb25zMiAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U2VydmVyRWRpdG9yU2VjdGlvbj4gaXRlcmF0b3IgPSBzZWN0aW9uczIuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9yUGFydElucHV0KSB7Ci0JCQlJU2VydmVyRWRpdG9yUGFydElucHV0IHNlcGkgPSAoSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgaW5wdXQ7Ci0JCQlzZXJ2ZXIgPSBzZXBpLmdldFNlcnZlcigpOwotCQkJY29tbWFuZE1hbmFnZXIgPSAoKFNlcnZlckVkaXRvclBhcnRJbnB1dCkgc2VwaSkuZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKTsKLQkJCXJlYWRPbmx5ID0gc2VwaS5pc1NlcnZlclJlYWRPbmx5KCk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJc2VjdGlvbi5pbml0KHNpdGUsIGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gYW5kIGFkZHMgaXQgdG8gdGhlIG9wZXJhdGlvbiBoaXN0b3J5Ci0JICogd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24gYW4gb3BlcmF0aW9uIHJlYWR5IHRvIGJlIGV4ZWN1dGVkCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWNvbW1hbmRNYW5hZ2VyLmV4ZWN1dGUob3BlcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcnZlciB0aGF0IGlzIGJlaW5nIGVkaXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2VydmVyIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgZWRpdG9yIHNlY3Rpb25zIGludG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gYWRkIHRoZSBzZWN0aW9uKHMpIHRvCi0JICogQHBhcmFtIGlkIHRoZSBzZWN0aW9uIGluc2VydGlvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNlY3Rpb25zKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoaWQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlzZWN0aW9uLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhlIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXNlY3Rpb24uZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlpZiAodG9vbGtpdCAhPSBudWxsKSB7Ci0JCQl0b29sa2l0LmRpc3Bvc2UoKTsKLQkJCXRvb2xraXQgPSBudWxsOwotCQl9Ci0JCQotCQljb21tYW5kTWFuYWdlciA9IG51bGw7Ci0JCXNlY3Rpb25Ub0luc2VydGlvbklkID0gbnVsbDsKLQkJc2VjdGlvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGZvcm0gdG9vbGtpdCB0byBjcmVhdGUgd2lkZ2V0cy4gSXQgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5Ci0JICogd2hlbiB0aGUgZWRpdG9yIGlzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheQotCSAqIEByZXR1cm4gRm9ybVRvb2xraXQKLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgZ2V0Rm9ybVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChtYW5hZ2VkRm9ybSAhPSBudWxsKQotCQkJcmV0dXJuIG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJCi0JCWlmICh0b29sa2l0ID09IG51bGwpCi0JCQl0b29sa2l0ID0gbmV3IEZvcm1Ub29sa2l0KGRpc3BsYXkpOwotCQlyZXR1cm4gdG9vbGtpdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWRhZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvclBhcnRJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBzZXJ2ZXIgZWRpdG9yIHNlY3Rpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQlwcml2YXRlIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wOwotCXByaXZhdGUgU2VydmVyRWRpdG9yUGFydCBlZGl0b3I7Ci0KLQkvKioKLQkgKiBUaGUgc2VydmVyIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNpdGUgdGhlIGVkaXRvciBzaXRlCi0JICogQHBhcmFtIGlucHV0IHRoZSBlZGl0b3IgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9yUGFydElucHV0KSB7Ci0JCQlJU2VydmVyRWRpdG9yUGFydElucHV0IHNlcGkgPSAoSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgaW5wdXQ7Ci0JCQlzZXJ2ZXIgPSBzZXBpLmdldFNlcnZlcigpOwotCQkJY29tbWFuZE1hbmFnZXIgPSAoKFNlcnZlckVkaXRvclBhcnRJbnB1dCkgc2VwaSkuZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKTsKLQkJCXJlYWRPbmx5ID0gc2VwaS5pc1NlcnZlclJlYWRPbmx5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBvcGVyYXRpb24gaGlzdG9yeQotCSAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIG9wZXJhdGlvbiByZWFkeSB0byBiZSBleGVjdXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQljb21tYW5kTWFuYWdlci5leGVjdXRlKG9wZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnRDb21wID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hlbGwgb2YgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2hlbGwKLQkgKi8KLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBwYXJlbnRDb21wLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHNlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlcnJvciBvciBzdGF0dXMgbWVzc2FnZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHRoZQotCSAqIHNlcnZlciByZXNvdXJjZSBpcyBzYXZlZC4gSWYgdGhlcmUgYXJlIGFueSBlcnJvciBtZXNzYWdlcywgdGhlCi0JICogdXNlciB3aWxsIGJlIHVuYWJsZSB0byBzYXZlIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoaXMKLQkgKiAgIHNlcnZlciBjYW4gYmUgc2F2ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkKLQkgKiAgIGl0IGNhbid0IGJlCi0JICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KLQkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIGdldFNhdmVTdGF0dXMoKSB7Ci0JCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLk9LX1NUQVRVUyB9OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZWRpdG9yIHBhcnQgdGhhdCB0aGlzIHNlY3Rpb24gYmVsb25ncyB0by4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJFZGl0b3JQYXJ0KFNlcnZlckVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXRoaXMuZWRpdG9yID0gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAc2VlICNnZXRNYW5hZ2VkRm9ybSgpIFVzZSBmb3JtcyBVSSBiYXNlZCBmb3IgZXJyb3JzIHZpYSB7QGxpbmsgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1lc3NhZ2VNYW5hZ2VyfQotCSAqICAgIG9uIHRoZSBtZXNzYWdlIGZvcm0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKLQkJCXJldHVybjsKLQkJCi0JCWVycm9yTWVzc2FnZSA9IGVycm9yOwotCQlpZiAoZWRpdG9yICE9IG51bGwpCi0JCQllZGl0b3IudXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZm9ybSB0b29sa2l0IHRvIGNyZWF0ZSB3aWRnZXRzLiBJdCB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkKLQkgKiB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICogQHJldHVybiBhIEZvcm1Ub29sa2l0Ci0JICovCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGdldEZvcm1Ub29sa2l0KERpc3BsYXkgZGlzcGxheSkgewotCQlyZXR1cm4gZWRpdG9yLmdldEZvcm1Ub29sa2l0KGRpc3BsYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoZSBlZGl0b3IgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGUgZWRpdG9yIGlzIHVzaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgIG1hbmFnZWQgZm9ybSBoYXMgYmVlbiBzZXQKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIElNYW5hZ2VkRm9ybSBnZXRNYW5hZ2VkRm9ybSgpIHsKLQkJcmV0dXJuIGVkaXRvci5nZXRNYW5hZ2VkRm9ybSgpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBzZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NGMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBlZGl0b3Igc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBjbGllbnRzIGNhbiBwcm92aWRlIHBhZ2VzLCBzZWN0aW9ucywgYW5kCi1hY3Rpb25zIHRvIGJlIGFkZGVkIHRvIHRoZSBlZGl0b3IgZm9yIGEgc3BlY2lmaWMgc2VydmVyIHR5cGUuIFRoaXMKLXBhY2thZ2UgY29udGFpbnMgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIHRoZXNlIGV4dGVuc2lvbiBwb2ludHMsIGFzCi13ZWxsIGFzIHRoZSBBUEkgdGhhdCB0aGV5IGNhbiB1c2UgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBzaGFyZWQKLWVkaXRvciBjb21tYW5kIGhpc3Rvcnkgc3RhY2sgYW5kIGludGVyYWN0IHdpdGggdGhlIGVkaXRpbmcgZnJhbWV3b3JrLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YzRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlByb3ZpZGVzIGVkaXRvciBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvYWJzdHJhY3Q+Ci0KLTxwPlVzaW5nIGV4dGVuc2lvbiBwb2ludHMsIGNsaWVudHMgY2FuIHByb3ZpZGUgcGFnZXMsIHNlY3Rpb25zLCBhbmQKLWFjdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhlIGVkaXRvciBmb3IgYSBzcGVjaWZpYyBzZXJ2ZXIgdHlwZS4gVGhpcwotcGFja2FnZSBjb250YWlucyB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgdGhlc2UgZXh0ZW5zaW9uIHBvaW50cywgYXMKLXdlbGwgYXMgdGhlIEFQSSB0aGF0IHRoZXkgY2FuIHVzZSB0byBwdXQgY29tbWFuZHMgb24gdGhlIHNoYXJlZAotZWRpdG9yIGNvbW1hbmQgaGlzdG9yeSBzdGFjayBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgZWRpdGluZyBmcmFtZXdvcmsuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NkOTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9FWElTVElORyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfRVhJU1RJTkdfVEFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2kwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX0NSRUFURSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfQ1JFQVRFX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9QUkVGRVJFTkNFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxNCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQ0xJRU5UX1dJWkFSRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzYzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9DTElFTlQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2MwMDAyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NFUlZFUl9UWVBFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwNiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1BST1BFUlRZX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDA0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUlVOVElNRV9XSVpBUkQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bnIwMDAwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9DT05GSUdVUkFUSU9OX1NFUlZFUl9DT01CTyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzbDAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1RBU0tfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zc3R3MDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfTU9EVUxFU19DT01QT1NJVEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bW0wMDAwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFURV9TRVJWRVJfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHRpMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1NFUlZFUl9ESUFMT0cgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDAyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9QVUJMSVNIX0JFRk9SRV9TVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMTIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9TSE9XX09OX0FDVElWSVRZID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERV9ERUJVRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9FTkFCTEVfQlJFQUtQT0lOVFMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNwZ2UwMDMyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTkVSQUxfUkVTVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TRVJWRVJTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zdmNwMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19TVEFUVVMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNkcGQwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HX0RFVEFJTFNfQlVUVE9OID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19ERVRBSUxTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfSVJSRVZFUlNJQkxFX0RJQUxPRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2RwaTAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX09WRVJWSUVXX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfU0VSVkVSID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT04gPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSE9TVE5BTUUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfUlVOVElNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BVVRPUFVCTElTSF9FTkFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDEyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQVVUT1BVQkxJU0hfRElTQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMTYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9QVUJMSVNIVEFTS1NfQ09ORklHVVJBVElPTiA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMTgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9USU1FT1VUX1NUQVJUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgInNwZ2UwMDI2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfVElNRU9VVF9TVE9QID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgInNwZ2UwMDI3IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfUExBWSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX0JST1dTRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1JFU0VUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAxMiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkZGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRNb25pdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRNb25pdG9yRGVsZWdhdGUgZXh0ZW5kcyBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgewotCXByb3RlY3RlZCBNYXA8U2VydmVyUG9ydCwgSU1vbml0b3I+IG1vbml0b3JzID0gbmV3IEhhc2hNYXA8U2VydmVyUG9ydCwgSU1vbml0b3I+KCk7Ci0JcHJvdGVjdGVkIElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXIoKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJbGlzdGVuZXIgPSBuZXcgSU1vbml0b3JMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vbml0b3JBZGRlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9uaXRvclJlbW92ZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChtb25pdG9yID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQlPYmplY3QgbW9uS2V5ID0gbnVsbDsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vbml0b3JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlPYmplY3QgdmFsdWUgPSBtb25pdG9ycy5nZXQoa2V5KTsKLQkJCQkJaWYgKG1vbml0b3IuZXF1YWxzKHZhbHVlKSkKLQkJCQkJCW1vbktleSA9IGtleTsKLQkJCQl9Ci0JCQkJaWYgKG1vbktleSAhPSBudWxsKQotCQkJCQltb25pdG9ycy5yZW1vdmUobW9uS2V5KTsKLQkJCQlpZiAobW9uaXRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCU1vbml0b3JDb3JlLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJCWxpc3RlbmVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU1vbml0b3JDb3JlLmFkZE1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZSNzdGFydE1vbml0b3Jpbmcob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQpCi0JICovCi0JcHVibGljIGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJTW9uaXRvciBtb25pdG9yID0gbW9uaXRvcnMuZ2V0KHBvcnQpOwotCQkJaW50IG1wb3J0ID0gLTE7Ci0JCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJbXBvcnQgPSBtb25pdG9yUG9ydDsKLQkJCQlpZiAobXBvcnQgPT0gLTEpCi0JCQkJCW1wb3J0ID0gU29ja2V0VXRpbC5maW5kVW51c2VkUG9ydCg1MDAwLCAxNTAwMCk7Ci0JCQkJCi0JCQkJLy8gc2hvdWxkIHNlYXJjaCBmb3IgYSBtb25pdG9yIGZpcnN0IC4uCi0JCQkJSU1vbml0b3JXb3JraW5nQ29weSB3YyA9IE1vbml0b3JDb3JlLmNyZWF0ZU1vbml0b3IoKTsKLQkJCQl3Yy5zZXRMb2NhbFBvcnQobXBvcnQpOwotCQkJCXdjLnNldFJlbW90ZUhvc3Qoc2VydmVyLmdldEhvc3QoKSk7Ci0JCQkJd2Muc2V0UmVtb3RlUG9ydChwb3J0LmdldFBvcnQoKSk7Ci0JCQkJaWYgKCJIVFRQIi5lcXVhbHMocG9ydC5nZXRQcm90b2NvbCgpKSkKLQkJCQkJd2Muc2V0UHJvdG9jb2woIkhUVFAiKTsKLQkJCQltb25pdG9yID0gd2Muc2F2ZSgpOwotCQkJCWFkZExpc3RlbmVyKCk7Ci0JCQl9IGVsc2UKLQkJCQltcG9ydCA9IG1vbml0b3IuZ2V0TG9jYWxQb3J0KCk7Ci0JCQltb25pdG9yLnN0YXJ0KCk7Ci0JCQltb25pdG9ycy5wdXQocG9ydCwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gbXBvcnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc3RhcnQgbW9uaXRvcmluZyIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRpbmdNb25pdG9yLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIG51bGwpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUjc3RvcE1vbml0b3Jpbmcob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCkgewotCQl0cnkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IG1vbml0b3JzLmdldChwb3J0KTsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc3RvcCBtb25pdG9yaW5nIiwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjViNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIEEgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgb25lIG9yIG1vcmUgb3ZlcmxheXMuCi0gKiBUaGUgb3ZlcmxheXMgYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQlwcml2YXRlIEltYWdlIG92ZXJsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UpIHsKLQkJdGhpcyhiYXNlSW1hZ2UsIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UKLQkgKiBAcGFyYW0gb3ZlcmxheQotCSAqLwotCXB1YmxpYyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgSW1hZ2Ugb3ZlcmxheSkgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOwotCQl9Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBvdGhlciA9IChEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gb3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLQkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7Ci0JCWRyYXdJbWFnZShkYXRhLCB4LCAwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgewotCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCQlmU2l6ZSA9IHNpemU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2VhYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciB7Ci0JcHJvdGVjdGVkIE1hcDxPYmplY3QsIEltYWdlPiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIEltYWdlPigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZSBpbWcgPSBtYXAuZ2V0KGVsZW1lbnQpOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXJldHVybiBpbWc7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBkc2lkID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIGVsZW1lbnQpLmdldFNlcnZlclN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQlkc2lkID0gbmV3IERlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IoaW1hZ2UsIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSykpOwotCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlLCBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSykpOwotCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlLCBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZHNpZCA9PSBudWxsKQotCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJSW1hZ2UgaW1hZ2UyID0gZHNpZC5jcmVhdGVJbWFnZSgpOwotCQltYXAucHV0KGVsZW1lbnQsIGltYWdlMik7Ci0JCXJldHVybiBpbWFnZTI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZGlzcG9zZSBpbWFnZXMiLCBlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlUnVudGltZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlUnVudGltZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQwMWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVJ1bnRpbWVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVSdW50aW1lRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0RGVsZXRlU2VydmVyczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRSZW1vdmVUYXJnZXRzOwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZVNlcnZlcnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlVGFyZ2V0czsKLQotCXB1YmxpYyBEZWxldGVSdW50aW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBib29sZWFuIHByb21wdERlbGV0ZVNlcnZlcnMsIGJvb2xlYW4gcHJvbXB0UmVtb3ZlVGFyZ2V0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBudWxsLCBNZXNzYWdlcy5kaWFsb2dSdW50aW1lSW5Vc2UsIFFVRVNUSU9OLAotCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0JCXRoaXMucHJvbXB0RGVsZXRlU2VydmVycyA9IHByb21wdERlbGV0ZVNlcnZlcnM7Ci0JCXRoaXMucHJvbXB0UmVtb3ZlVGFyZ2V0cyA9IHByb21wdFJlbW92ZVRhcmdldHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICghcHJvbXB0RGVsZXRlU2VydmVycyAmJiAhcHJvbXB0UmVtb3ZlVGFyZ2V0cykKLQkJCXJldHVybiBudWxsOwotCQkKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJaWYgKHByb21wdERlbGV0ZVNlcnZlcnMpIHsKLQkJCWRlbGV0ZVNlcnZlcnMgPSB0cnVlOwotCQkJZmluYWwgQnV0dG9uIGRlbGV0ZVNlcnZlcnNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCQlkZWxldGVTZXJ2ZXJzQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUnVudGltZURlbGV0ZVNlcnZlcnMpOwotCQkJZGVsZXRlU2VydmVyc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlkZWxldGVTZXJ2ZXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZGVsZXRlU2VydmVycyA9IGRlbGV0ZVNlcnZlcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWlmIChwcm9tcHRSZW1vdmVUYXJnZXRzKSB7Ci0JCQlyZW1vdmVUYXJnZXRzID0gdHJ1ZTsKLQkJCWZpbmFsIEJ1dHRvbiByZW1vdmVUYXJnZXRzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQkJcmVtb3ZlVGFyZ2V0c0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVSZW1vdmVUYXJnZXRzKTsKLQkJCXJlbW92ZVRhcmdldHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJcmVtb3ZlVGFyZ2V0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlbW92ZVRhcmdldHMgPSByZW1vdmVUYXJnZXRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZVNlcnZlcnMoKSB7Ci0JCXJldHVybiBkZWxldGVTZXJ2ZXJzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtb3ZlVGFyZ2V0cygpIHsKLQkJcmV0dXJuIHJlbW92ZVRhcmdldHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVNlcnZlckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlU2VydmVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWU4NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlU2VydmVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXI7Ci0vKioKLSAqIERpYWxvZyB0aGF0IHByb21wdHMgYSB1c2VyIHRvIGRlbGV0ZSBzZXJ2ZXIocykgYW5kL29yIHNlcnZlciBjb25maWd1cmF0aW9uKHMpLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlU2VydmVyRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJbXSBzZXJ2ZXJzOwotCXByb3RlY3RlZCBJRm9sZGVyW10gY29uZmlnczsKLQotCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXI+IHJ1bm5pbmdTZXJ2ZXJzTGlzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5uaW5nU2VydmVyQ2FuU3RvcDsKLQotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVDb25maWdzOwotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nOwotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nU3RvcDsKLQotCS8qKgotCSAqIERlbGV0ZVNlcnZlckRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlcnMgYW4gYXJyYXkgb2Ygc2VydmVycwotCSAqIEBwYXJhbSBjb25maWdzIGFuIGFycmF5IG9mIHNlcnZlciBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBEZWxldGVTZXJ2ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXJbXSBzZXJ2ZXJzLCBJRm9sZGVyW10gY29uZmlncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nVGl0bGUsIG51bGwsIG51bGwsIFFVRVNUSU9OLAotCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotCQkKLQkJaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBjb25maWdzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQl0aGlzLnNlcnZlcnMgPSBzZXJ2ZXJzOwotCQl0aGlzLmNvbmZpZ3MgPSBjb25maWdzOwotCQkKLQkJcnVubmluZ1NlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwotCQlmb3IgKGludCBpID0gMCA7IGkgPCBzZXJ2ZXJzLmxlbmd0aCA7ICsraSkgewotCQkJaWYgKHNlcnZlcnNbaV0uZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJcnVubmluZ1NlcnZlcnNMaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQotCQkJaWYgKHNlcnZlcnNbaV0uY2FuU3RvcCgpLmlzT0soKSkKLQkJCQlydW5uaW5nU2VydmVyQ2FuU3RvcCA9IHRydWU7Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXJzLmxlbmd0aCA9PSAxKQotCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2UsIHNlcnZlcnNbMF0uZ2V0TmFtZSgpKTsKLQkJZWxzZQotCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2VNYW55LCBzZXJ2ZXJzLmxlbmd0aCArICIiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkRFTEVURV9TRVJWRVJfRElBTE9HKTsKLQkJCi0JCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKLQkJCWNoZWNrRGVsZXRlQ29uZmlncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJY2hlY2tEZWxldGVDb25maWdzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nTG9vc2VDb25maWd1cmF0aW9ucywgY29uZmlnc1swXS5nZXROYW1lKCkpKTsKLQkJCWNoZWNrRGVsZXRlQ29uZmlncy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJCi0JCS8vIHByb21wdCBmb3Igc3RvcHBpbmcgcnVubmluZyBzZXJ2ZXJzCi0JCWludCBzaXplID0gcnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPiAwKSB7Ci0JCQljaGVja0RlbGV0ZVJ1bm5pbmcgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWNoZWNrRGVsZXRlUnVubmluZy5zZXRUZXh0KE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXIpOwotCQkJY2hlY2tEZWxldGVSdW5uaW5nLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQotCQkJaWYgKHJ1bm5pbmdTZXJ2ZXJDYW5TdG9wKSB7Ci0JCQkJY2hlY2tEZWxldGVSdW5uaW5nU3RvcCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0VGV4dChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyU3RvcCk7Ci0JCQkJY2hlY2tEZWxldGVSdW5uaW5nU3RvcC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OwotCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkKLQkJCQljaGVja0RlbGV0ZVJ1bm5pbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0RW5hYmxlZChjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IE9LKSB7Ci0JCQlmaW5hbCBib29sZWFuIGNoZWNrZWQgPSAoY2hlY2tEZWxldGVDb25maWdzICE9IG51bGwgJiYgY2hlY2tEZWxldGVDb25maWdzLmdldFNlbGVjdGlvbigpKTsKLQkJCWZpbmFsIGJvb2xlYW4gZGVsZXRlUnVubmluZyA9IChjaGVja0RlbGV0ZVJ1bm5pbmcgIT0gbnVsbCAmJiBjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOwotCQkJZmluYWwgYm9vbGVhbiBkZWxldGVSdW5uaW5nU3RvcCA9IChjaGVja0RlbGV0ZVJ1bm5pbmdTdG9wICE9IG51bGwgJiYgY2hlY2tEZWxldGVSdW5uaW5nU3RvcC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiRGVsZXRlIHNlcnZlcnMiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAocnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHN0b3Agc2VydmVycyBhbmQvb3IgdXBkYXRlcyBzZXJ2ZXJzJyBsaXN0Ci0JCQkJCQlwcmVwYXJlRm9yRGVsZXRpb24oZGVsZXRlUnVubmluZywgZGVsZXRlUnVubmluZ1N0b3ApOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlKb2Igam9iID0gbmV3IEpvYihNZXNzYWdlcy5kZWxldGVTZXJ2ZXJUYXNrKSB7Ci0JCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJaWYgKHNlcnZlcnMubGVuZ3RoID09IDApIHsKLQkJCQkJCQkJLy8gYWxsIHNlcnZlcnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSBsaXN0Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJCQotCQkJCQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCQkJCXNlcnZlcnNbaV0uZGVsZXRlKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAoY2hlY2tlZCkgewotCQkJCQkJCQkJc2l6ZSA9IGNvbmZpZ3MubGVuZ3RoOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQkJCQkJY29uZmlnc1tpXS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSBkZWxldGluZyByZXNvdXJjZXMiLCBlKTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7IAotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCS8vIHNldCBydWxlIGZvciB3b3Jrc3BhY2UgYW5kIHNlcnZlcnMKLQkJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW3NpemUrMV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJcnVsZXNbaV0gPSBzZXJ2ZXJzW2ldOwotCQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJCQlydWxlc1tzaXplXSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQkJCWpvYi5zZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHJ1bGVzKSk7Ci0JCQkJCWpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOwotCQkJCQkKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfTsKLQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJdC5zdGFydCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgc2VydmVycycgJiBjb25maWdzJyBsaXN0cy4gSWYgPGNvZGU+ZGVsZXRlUnVubmluZzwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiAJYW5kIGEgc2VydmVyIGNhbid0IGJlIHN0b3BwZWQsIGl0IGlzbid0IHJlbW92ZWQuCi0JICogQHBhcmFtIGRlbGV0ZVJ1bm5pbmcgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gcnVubmluZyBzZXJ2ZXJzIHdpbGwgYmUgc3RvcHBlZAotCSAqIAliZWZvcmUgYmVpbmcgZGVsZXRlZCwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHJ1bm5pbmcgc2VydmVycyB3aWxsIGJlIHJlbW92ZWQKLQkgKiAgICBmcm9tIGRlbGV0aW9uIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckRlbGV0aW9uKGJvb2xlYW4gZGVsZXRlUnVubmluZywgYm9vbGVhbiBzdG9wUnVubmluZykgewotCQkvLyBjb252ZXJ0cyBzZXJ2ZXJzICYgY29uZmlncyB0byBsaXN0IHRvIGZhY2lsaXRhdGUgcmVtb3ZhbAotCQlMaXN0PElTZXJ2ZXI+IHNlcnZlcnNMaXN0ID0gbmV3IExpbmtlZExpc3Q8SVNlcnZlcj4oQXJyYXlzLmFzTGlzdChzZXJ2ZXJzKSk7Ci0JCUxpc3Q8SUZvbGRlcj4gY29uZmlnc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxJRm9sZGVyPihBcnJheXMuYXNMaXN0KGNvbmZpZ3MpKTsKLQkJaWYgKCFkZWxldGVSdW5uaW5nKSB7Ci0JCQkvLyBkb24ndCBkZWxldGUgc2VydmVycyBvciBjb25maWd1cmF0aW9ucwotCQkJaW50IHNpemUgPSBydW5uaW5nU2VydmVyc0xpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5nZXQoaSk7Ci0JCQkJc2VydmVyc0xpc3QucmVtb3ZlKHNlcnZlcik7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKLQkJCQkJY29uZmlnc0xpc3QucmVtb3ZlKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN0b3BSdW5uaW5nKSB7Ci0JCQkJLy8gc3RvcCBydW5uaW5nIHNlcnZlcnMgYW5kIHdhaXQgZm9yIHRoZW0gKHN0b3AgaXMgYXN5bmNocm9ub3VzKQotCQkJCUlTZXJ2ZXIgczsKLQkJCQlNdWx0aVNlcnZlclN0b3BMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNdWx0aVNlcnZlclN0b3BMaXN0ZW5lcigpOwotCQkJCWludCBleHBlY3RlZCA9IDA7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlzID0gKElTZXJ2ZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocy5jYW5TdG9wKCkuaXNPSygpKSB7Ci0JCQkJCQkrK2V4cGVjdGVkOwotCQkJCQkJcy5zdG9wKGZhbHNlLCBsaXN0ZW5lcik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzZXJ2ZXIgY2FuJ3QgYmUgc3RvcHBlZCwgZG9uJ3QgZGVsZXRlIGl0Ci0JCQkJCQlzZXJ2ZXJzTGlzdC5yZW1vdmUocyk7Ci0JCQkJCQljb25maWdzTGlzdC5yZW1vdmUocy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXdoaWxlIChleHBlY3RlZCAhPSBsaXN0ZW5lci5nZXROdW1iZXJTdG9wcGVkKCkpIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3Igc2VydmVycyBzdG9wIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNlcnZlcnMgPSBuZXcgSVNlcnZlcltzZXJ2ZXJzTGlzdC5zaXplKCldOwotCQlzZXJ2ZXJzTGlzdC50b0FycmF5KHNlcnZlcnMpOwotCQljb25maWdzID0gbmV3IElGb2xkZXJbY29uZmlnc0xpc3Quc2l6ZSgpXTsKLQkJY29uZmlnc0xpc3QudG9BcnJheShjb25maWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGFzcyB1c2VkIHRvIHdhaXQgYWxsIHNlcnZlcnMgc3RvcC4gVXNlIG9uZSBpbnN0YW5jZQotCSAqIGZvciBhIGdyb3VwIG9mIHNlcnZlcnMgYW5kIGxvb3AgdG8gc2VlIGlmIHRoZSBudW1iZXIgc3RvcHBlZAotCSAqIGVxdWFscyB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgd2FpdGluZyB0byBzdG9wLgotCSAqLwotCWNsYXNzIE11bHRpU2VydmVyU3RvcExpc3RlbmVyIGltcGxlbWVudHMgSU9wZXJhdGlvbkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIGludCBudW07IAotCi0JCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCW51bSsrOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROdW1iZXJTdG9wcGVkKCkgewotCQkJcmV0dXJuIG51bTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9FY2xpcHNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRWNsaXBzZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkYWJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9FY2xpcHNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci0vKioKLSAqIEVjbGlwc2UgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVV0aWwgewotCS8qKgotCSAqIEVjbGlwc2VVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBwYXRoIGlzCi0JICogbnVsbCwgaXQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLgotCSAqCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2UuSVBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVNlcnZlclByb2plY3QoU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvL21vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJLy9tb25pdG9yLmJlZ2luVGFzayhTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVjcmVhdGVTZXJ2ZXJQcm9qZWN0VGFzayIpLCAzMDAwKTsKLQkJCi0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCQkKLQkJCS8vIGdldCBhIHByb2plY3QgZGVzY3JpcHRvcgotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5uZXdQcm9qZWN0RGVzY3JpcHRpb24obmFtZSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwYXRoKTsKLQkJCQotCQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXByb2plY3Qub3BlbihQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCS8vIGFkZCB0aGUgc2VydmVyIHByb2plY3QgbmF0dXJlCi0JCQlTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgcHJvamVjdCBuYW1lZCAiICsgbmFtZSwgY2UpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdFN0YXR1cywgY2UuZ2V0TWVzc2FnZSgpKSwgY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgcHJvamVjdCAoMikgbmFtZWQgIiArIG5hbWUsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdCwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgcGF0aCBpcwotCSAqIG51bGwsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIG5hbWUgYSBuYW1lCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZU5ld1NlcnZlclByb2plY3QoZmluYWwgU2hlbGwgc2hlbGwsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTZXJ2ZXJQcm9qZWN0KG5hbWUsIHBhdGgsIG1vbml0b3IpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTaGVsbCBzaGVsbDIgPSBzaGVsbDsKLQkJCQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQkJCQlzaGVsbDIgPSBnZXRTaGVsbCgpOwotCQkJCQlvcGVuRXJyb3Ioc2hlbGwyLCBNZXNzYWdlcy5lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdCwgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciBhIHByb2plY3QuCi0JICoKLQkgKiBAcGFyYW0gcHJvamVjdCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UHJvamVjdEltYWdlRGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IChJV29ya2JlbmNoQWRhcHRlcikgcHJvamVjdC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLQkKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEltYWdlRGVzY3JpcHRvcihwcm9qZWN0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNoZWxsIGZvciB0aGUgd29ya2JlbmNoLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNwbGF5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0KLQkJcmV0dXJuIGRpc3BsYXk7CQkKLQl9CQotCQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZGlhbG9nIHdpbmRvdy4KLQkgKgotCSAqIEBwYXJhbSBtZXNzYWdlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gc3RhdHVzIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBJU3RhdHVzIHN0YXR1cykgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgotCSAqCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgotCSAqCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZSBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIHZhbGlkYXRlRWRpdCgpIG9uIHRoZSBnaXZlbiBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRlIGVkaXQgd29ya2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRWRpdChTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTZXJ2ZXJVdGlsLnZhbGlkYXRlRWRpdChzaGVsbCwgc2VydmVyKTsKLQkJcmV0dXJuIHZhbGlkYXRlRWRpdChzaGVsbCwgc3RhdHVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KFNoZWxsIHNoZWxsLCBJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJLy8gaW5mb3JtIHVzZXIKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yVmFsaWRhdGVFZGl0RmFpbHVyZU1lc3NhZ2U7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0KLQkJCS8vIGRvIG5vdCBleGVjdXRlIGNvbW1hbmQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJhbFRvb2xUaXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyYWxUb29sVGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTc0ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJhbFRvb2xUaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFRvb2xUaXAgaW1wbGVtZW50cyBJU2VydmVyVG9vbFRpcCB7Ci0JcHVibGljIEdlbmVyYWxUb29sVGlwKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyIHNlcnZlcikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsU1dULk5PTkUpOwotCQl0ZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCVN0cmluZyBzID0gIiI7Ci0JCWlmIChzZXJ2ZXIuZ2V0UnVudGltZSgpICE9IG51bGwpCi0JCQlzICs9IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0TmFtZSgpICsgIiAtICI7Ci0JCXMgKz0gc2VydmVyLmdldE1vZHVsZXMoKS5sZW5ndGggKyAiIG1vZHVsZXMiOwotCQl0ZXh0LnNldFRleHQocyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0ltYWdlUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0ltYWdlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzNjVlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25EZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBpbWFnZSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVJlc291cmNlIHsKLQkvLyB0aGUgaW1hZ2UgcmVnaXN0cnkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvLyBtYXAgb2YgaW1hZ2UgZGVzY3JpcHRvcnMgc2luY2UgdGhlc2UKLQkvLyB3aWxsIGJlIGxvc3QgYnkgdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzOwotCi0JLy8gYmFzZSB1cmxzIGZvciBpbWFnZXMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwotCQkJSUNPTl9CQVNFX1VSTCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2V0IGljb24gYmFzZSBVUkwiLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQ0xDTCA9ICJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NUT09MID0gImN0b29sMTYvIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VMQ0wgPSAiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FVE9PTCA9ICJldG9vbDE2LyI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9ETENMID0gImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRFRPT0wgPSAiZHRvb2wxNi8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PQkogPSAib2JqMTYvIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09WUiA9ICJvdnIxNi8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9XSVpCQU4gPSAid2l6YmFuLyI7Ci0KLQkvLyAtLS0gY29uc3RhbnRzIGZvciBpbWFnZXMgLS0tCi0KLQkvLyBTZXJ2ZXIgU3RhdGUgSW1hZ2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU1RBUlQgPSAiSU1HX0NMQ0xfU1RBUlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NUQVJUX0RFQlVHID0gIklNR19DTENMX1NUQVJUX0RFQlVHIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFID0gIklNR19DTENMX1NUQVJUX1BST0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NUT1AgPSAiSU1HX0NMQ0xfU1RPUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfUFVCTElTSCA9ICJJTUdfQ0xDTF9QVUJMSVNIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9ESVNDT05ORUNUID0gIklNR19DTENMX0RJU0NPTk5FQ1QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1RBUlQgPSAiSU1HX0VMQ0xfU1RBUlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NUQVJUX0RFQlVHID0gIklNR19FTENMX1NUQVJUX0RFQlVHIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVEFSVF9QUk9GSUxFID0gIklNR19FTENMX1NUQVJUX1BST0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NUT1AgPSAiSU1HX0VMQ0xfU1RPUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfUFVCTElTSCA9ICJJTUdfRUxDTF9QVUJMSVNIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9ESVNDT05ORUNUID0gIklNR19FTENMX0RJU0NPTk5FQ1QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1RBUlQgPSAiSU1HX0RMQ0xfU1RBUlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUQVJUX0RFQlVHID0gIklNR19ETENMX1NUQVJUX0RFQlVHIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVEFSVF9QUk9GSUxFID0gIklNR19ETENMX1NUQVJUX1BST0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUT1AgPSAiSU1HX0RMQ0xfU1RPUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfUFVCTElTSCA9ICJJTUdfRExDTF9QVUJMSVNIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ESVNDT05ORUNUID0gIklNR19ETENMX0RJU0NPTk5FQ1QiOwotCi0JLy8gV2l6YXJkIEJhbm5lciBJbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV19SVU5USU1FID0gIm5ld1NlcnZlcldpeiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdfU0VSVkVSID0gIm5ld1NlcnZlcldpeiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCA9ICJ3aXpDbGllbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUiA9ICJzZWxlY3RTZXJ2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fSU1QT1JUX1NFUlZFUl9DT05GSUdVUkFUSU9OID0gImltcG9ydENvbmZpZ1dpeiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQgPSAic3RhdGVTdGFydGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcgPSAic3RhdGVTdGFydGVkRGVidWciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFID0gInN0YXRlU3RhcnRlZFByb2ZpbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCA9ICJzdGF0ZVN0b3BwZWQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TVEFURV9TVEFSVEVEID0gInN0YXRlU3RhcnRlZDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TVEFURV9TVE9QUEVEID0gInN0YXRlU3RvcHBlZDIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSA9ICJzdGF0ZVN0YXJ0aW5nMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yID0gInN0YXRlU3RhcnRpbmcyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMgPSAic3RhdGVTdGFydGluZzMiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSA9ICJzdGF0ZVN0b3BwaW5nMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yID0gInN0YXRlU3RvcHBpbmcyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzMgPSAic3RhdGVTdG9wcGluZzMiOwotCi0JLy8gU2VydmVyIENsaWVudCBJbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfQ1RPT0xfQ0xJRU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19DVE9PTF9DTElFTlQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0NUT09MX0NMSUVOVDMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9ORVdfU0VSVkVSID0gIklNR19DVE9PTF9ORVdfU0VSVkVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSA9ICJJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX01PRElGWV9NT0RVTEVTID0gIklNR19DVE9PTF9NT0RJRllfTU9EVUxFUyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfRVRPT0xfQ0xJRU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19FVE9PTF9DTElFTlQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0VUT09MX0NMSUVOVDMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9SRVNFVF9ERUZBVUxUID0gIklNR19FVE9PTF9SRVNFVF9ERUZBVUxUIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9SVU5fT05fU0VSVkVSID0gIklNR19EVE9PTF9DTElFTlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9ERUJVR19PTl9TRVJWRVIgPSAiSU1HX0RUT09MX0NMSUVOVDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9QUk9GSUxFX09OX1NFUlZFUiA9ICJJTUdfRFRPT0xfQ0xJRU5UMyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX01PRElGWV9NT0RVTEVTID0gIklNR19EVE9PTF9NT0RJRllfTU9EVUxFUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1JFU0VUX0RFRkFVTFQgPSAiSU1HX0RUT09MX1JFU0VUX0RFRkFVTFQiOwotCi0JLy8gR2VuZXJhbCBPYmplY3QgSW1hZ2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUiA9ICJzZXJ2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9OT05FID0gIm5vQ29uZmlndXJhdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9DT05GSUdVUkFUSU9OX01JU1NJTkcgPSAiY29uZmlndXJhdGlvbk1pc3NpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9KRUNUX01JU1NJTkcgPSAicHJvamVjdE1pc3NpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SRVBBSVJfQ09ORklHVVJBVElPTiA9ICJyZXBhaXJDb25maWd1cmF0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QVUJMSVNIX0VOQUJMRUQgPSAicHVibGlzaEVuYWJsZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QVUJMSVNIX0RJU0FCTEVEID0gInB1Ymxpc2hEaXNhYmxlZCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT04gPSAibW9uaXRvck9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTU9OSVRPUl9PRkYgPSAibW9uaXRvck9mZiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFRkFVTFRfU0VSVkVSX09WRVJMQVkgPSAiZGVmYXVsdFNlcnZlck92ZXJsYXkiOwotCQotCS8vIEF1ZGlvIGltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BVURJT19TT1VORCA9ICJzb3VuZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FVRElPX0NBVEVHT1JZID0gImNhdGVnb3J5IjsKLQotCS8qKgotCSAqIENhbm5vdCBjb25zdHJ1Y3QgYW4gSW1hZ2VSZXNvdXJjZS4gVXNlIHN0YXRpYyBtZXRob2RzIG9ubHkuCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlc291cmNlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgZWxlbWVudCBpbWFnZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlyZXR1cm4gaWQ7Ci0JCQotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgewotCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCi0JCS8vIHdpemFyZCBiYW5uZXJzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWkJBTl9ORVdfU0VSVkVSLCBVUkxfV0laQkFOICsgIm5ld19zZXJ2ZXJfd2l6LnBuZyIpOwotCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fSU1QT1JUX1NFUlZFUl9DT05GSUdVUkFUSU9OLCBVUkxfV0laQkFOICsgImltcG9ydF9jb25maWd1cmF0aW9uX3dpei5wbmciKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVJfQ0xJRU5ULCBVUkxfV0laQkFOICsgInNlbGVjdF9jbGllbnRfd2l6LnBuZyIpOwotCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUiwgVVJMX1dJWkJBTiArICJzZWxlY3Rfc2VydmVyX3dpei5wbmciKTsKLQotCQkvLyBjbGllbnQgaW1hZ2VzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9FVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9FVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfRVRPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9SRVNFVF9ERUZBVUxULCBVUkxfRVRPT0wgKyAiY2xlYXIuZ2lmIik7Ci0KLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfUlVOX09OX1NFUlZFUiwgVVJMX0NUT09MICsgInJ1bl9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX0RFQlVHX09OX1NFUlZFUiwgVVJMX0NUT09MICsgImRlYnVnX29uX3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfUFJPRklMRV9PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJwcm9maWxlX29uX3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfTkVXX1NFUlZFUiwgVVJMX0NUT09MICsgIndpel9uZXdfc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19DVE9PTF9ORVdfU0VSVkVSX0lOU1RBTkNFLCBVUkxfQ1RPT0wgKyAid2l6X25ld19pbnN0YW5jZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfTU9ESUZZX01PRFVMRVMsIFVSTF9DVE9PTCArICJ3aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIik7Ci0KLQkJcmVnaXN0ZXJJbWFnZShJTUdfRFRPT0xfUlVOX09OX1NFUlZFUiwgVVJMX0RUT09MICsgInJ1bl9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX0RFQlVHX09OX1NFUlZFUiwgVVJMX0RUT09MICsgImRlYnVnX29uX3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRFRPT0xfUFJPRklMRV9PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJwcm9maWxlX29uX3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRFRPT0xfTU9ESUZZX01PRFVMRVMsIFVSTF9EVE9PTCArICJ3aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1JFU0VUX0RFRkFVTFQsIFVSTF9EVE9PTCArICJjbGVhci5naWYiKTsKLQkKLQkJLy8gbG9hZCBzZXJ2ZXIgc3RhdGUgaW1hZ2VzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVELCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGVkLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVRywgVVJMX09CSiArICJzZXJ2ZXJfc3RhcnRlZF9kZWJ1Zy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSwgVVJMX09CSiArICJzZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCwgVVJMX09CSiArICJzZXJ2ZXJfc3RvcHBlZC5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NUQVRFX1NUQVJURUQsIFVSTF9PQkogKyAic3RhdGVfc3RhcnRlZC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU1RBVEVfU1RPUFBFRCwgVVJMX09CSiArICJzdGF0ZV9zdG9wcGVkLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMy5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzEuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzMuZ2lmIik7Ci0JCi0JCS8vIGxvYWQgYWN0aW9uIGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1BVQkxJU0gsIFVSTF9FTENMICsgImxhdW5jaF9wdWJsaXNoLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJULCBVUkxfRUxDTCArICJsYXVuY2hfcnVuLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJUX0RFQlVHLCBVUkxfRUxDTCArICJsYXVuY2hfZGVidWcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSwgVVJMX0VMQ0wgKyAibGF1bmNoX3Byb2ZpbGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RPUCwgVVJMX0VMQ0wgKyAibGF1bmNoX3N0b3AuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfRElTQ09OTkVDVCwgVVJMX0VMQ0wgKyAibGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfUFVCTElTSCwgVVJMX0NMQ0wgKyAibGF1bmNoX3B1Ymxpc2guZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlQsIFVSTF9DTENMICsgImxhdW5jaF9ydW4uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlRfREVCVUcsIFVSTF9DTENMICsgImxhdW5jaF9kZWJ1Zy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFLCBVUkxfQ0xDTCArICJsYXVuY2hfcHJvZmlsZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVE9QLCBVUkxfQ0xDTCArICJsYXVuY2hfc3RvcC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9ESVNDT05ORUNULCBVUkxfQ0xDTCArICJsYXVuY2hfZGlzY29ubmVjdC5naWYiKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9QVUJMSVNILCBVUkxfRExDTCArICJsYXVuY2hfcHVibGlzaC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVCwgVVJMX0RMQ0wgKyAibGF1bmNoX3J1bi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVF9ERUJVRywgVVJMX0RMQ0wgKyAibGF1bmNoX2RlYnVnLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUQVJUX1BST0ZJTEUsIFVSTF9ETENMICsgImxhdW5jaF9wcm9maWxlLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUT1AsIFVSTF9ETENMICsgImxhdW5jaF9zdG9wLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX0RJU0NPTk5FQ1QsIFVSTF9ETENMICsgImxhdW5jaF9kaXNjb25uZWN0LmdpZiIpOwotCQotCQkvLyBsb2FkIGdlbmVyYWwgb2JqZWN0IGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVIsIFVSTF9PQkogKyAic2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9OT05FLCBVUkxfT0JKICsgImNvbmZpZ3VyYXRpb25fbm9uZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTUlTU0lORywgVVJMX09CSiArICJjb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BST0pFQ1RfTUlTU0lORywgVVJMX09CSiArICJwcm9qZWN0X21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1JFUEFJUl9DT05GSUdVUkFUSU9OLCBVUkxfT0JKICsgInJlcGFpcl9jb25maWcuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRU5BQkxFRCwgVVJMX09CSiArICJwdWJsaXNoX2VuYWJsZWQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRElTQUJMRUQsIFVSTF9PQkogKyAicHVibGlzaF9kaXNhYmxlZC5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX01PTklUT1JfT04sIFVSTF9PQkogKyAibW9uaXRvck9uLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19NT05JVE9SX09GRiwgVVJMX09CSiArICJtb25pdG9yT2ZmLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSwgVVJMX09WUiArICJkZWZhdWx0X3NlcnZlcl9vdnIuZ2lmIik7Ci0JCQotCQkvLyBhdWRpbyBpbWFnZXMKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQVVESU9fU09VTkQsIFVSTF9PQkogKyAiYXVkaW9fc291bmQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0FVRElPX0NBVEVHT1JZLCBVUkxfT0JKICsgImF1ZGlvX2NhdGVnb3J5LmdpZiIpOwotCQkKLQkJbG9hZFNlcnZlckltYWdlcygpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5yZWdpc3Rlckljb25Gb3JGYW1pbHkoCi0JCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19TRVJWRVIpLCBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVySW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwgcGFydGlhbFVSTCkpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlICIgKyBrZXkgKyAiIGZyb20gIiArIHBhcnRpYWxVUkwsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIGltYWdlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRTZXJ2ZXJJbWFnZXMoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJJbWFnZXMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlsb2FkU2VydmVySW1hZ2VzKHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIFNlcnZlclVJUGx1Z2luLkVYVEVOU0lPTl9TRVJWRVJfSU1BR0VTKSk7Ci0JCVNlcnZlclVJUGx1Z2luLmFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVySW1hZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgaW1hZ2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFNlcnZlckltYWdlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZikgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjZltpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgaWNvblBhdGggPSBjZltpXS5nZXRBdHRyaWJ1dGUoImljb24iKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKG5hbWUsIGljb25QYXRoKTsKLQkJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwgJiYgaWNvblBhdGggIT0gbnVsbCAmJiBpY29uUGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQkJCi0JCQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHR5cGVJZHMgPSBTZXJ2ZXJVSVBsdWdpbi50b2tlbml6ZShjZltpXS5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJCQkJaW50IHNpemUyID0gdHlwZUlkcy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJaW1hZ2VSZWdpc3RyeS5wdXQodHlwZUlkc1tqXSwgaW1hZ2VEZXNjcmlwdG9yKTsJCQotCQkJCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQodHlwZUlkc1tqXSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBzZXJ2ZXJJbWFnZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVySW1hZ2U6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVNlcnZlckltYWdlRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJRXh0ZW5zaW9uRGVsdGEuQURERUQpCi0JCQlsb2FkU2VydmVySW1hZ2VzKGNmKTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIHR5cGVJZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpOwotCQkJCWltYWdlUmVnaXN0cnkucmVtb3ZlKHR5cGVJZCk7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9ycy5yZW1vdmUodHlwZUlkKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Jbml0aWFsaXplSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Jbml0aWFsaXplSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWJlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW5pdGlhbGl6ZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0vKioKLSAqIEpvYiB0byBpbml0aWFsaXplIHRoZSBzZXJ2ZXIgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXplSm9iIGV4dGVuZHMgSm9iIHsKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGpvYi4KLQkgKi8KLQlwdWJsaWMgSW5pdGlhbGl6ZUpvYigpIHsKLQkJc3VwZXIoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXNlcnZlcnNbaV0uYWRkU2VydmVyTGlzdGVuZXIoU2VydmVyVUlQbHVnaW4uc2VydmVyTGlzdGVuZXIpOwotCQkJCXNlcnZlcnNbaV0uYWRkUHVibGlzaExpc3RlbmVyKFNlcnZlclVJUGx1Z2luLnB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoQ2xpZW50Sm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMzFhM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoQ2xpZW50Sm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hDbGllbnRKb2IgZXh0ZW5kcyBDaGFpbmVkSm9iIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQlwcm90ZWN0ZWQgSUNsaWVudCBjbGllbnQ7Ci0JcHJvdGVjdGVkIElMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7Ci0JcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQotCXB1YmxpYyBMYXVuY2hDbGllbnRKb2IoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVbXSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsIElMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlciwgSUNsaWVudCBjbGllbnQpIHsKLQkJc3VwZXIoTWVzc2FnZXMubGF1bmNoaW5nQ2xpZW50VGFzaywgc2VydmVyKTsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCXRoaXMubW9kdWxlQXJ0aWZhY3QgPSBtb2R1bGVBcnRpZmFjdDsKLQkJdGhpcy5sYXVuY2hhYmxlQWRhcHRlciA9IGxhdW5jaGFibGVBZGFwdGVyOwotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQkJc2V0UnVsZShzZXJ2ZXIpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMYXVuY2hDbGllbnQgam9iIik7Ci0KLQkJLy8gd2FpdCBmb3IgdXAgdG8gNSBtaW51dGVzCi0JCWZpbmFsIFNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBnZXRTZXJ2ZXIoKTsKLQkJaW50IHN0YXRlID0gc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JCWludCBjb3VudCA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuZ2V0TW9kdWxlU3RhcnRUaW1lb3V0KCk7Ci0JCXdoaWxlIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HICYmIGNvdW50ID4gMCkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJY291bnQgLT0gMjAwMDsKLQkJCXN0YXRlID0gc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTGF1bmNoQ2xpZW50IGpvYiAyICIgKyBzdGF0ZSk7Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMYXVuY2hDbGllbnQgam9iIDMiKTsKLQkJCi0JCS8vIGRpc3BsYXkgY2xpZW50IG9uIFVJIHRocmVhZAotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkF0dGVtcHRpbmcgdG8gbG9hZCBjbGllbnQ6ICIgKyBjbGllbnQuZ2V0SWQoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IGxhdW5jaGFibGUgPSBsYXVuY2hhYmxlQWRhcHRlci5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNsaWVudC5sYXVuY2goc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlLCBzZXJ2ZXIuZ2V0TGF1bmNoKCkpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihudWxsLCBzdGF0dXMpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKG51bGwsIGNlLmdldFN0YXR1cygpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJTZXJ2ZXIgY2xpZW50IGZhaWxlZCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTGF1bmNoQ2xpZW50IGpvYiA0Iik7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlNTdiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotLyoqCi0gKiBUaGUgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaG9sZHMgc2VydmVyIGxhdW5jaGluZyBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIFNlcnZlclByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCXByb3RlY3RlZCBTZXJ2ZXJVSVByZWZlcmVuY2VzIHVpUHJlZmVyZW5jZXM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCZWZvcmVTdGFydDsKLQotCXByb3RlY3RlZCBieXRlIHNhdmVFZGl0b3JzOwotCXByb3RlY3RlZCBCdXR0b25bXSBzYXZlQnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IGxhdW5jaE1vZGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbltdIGxhdW5jaE1vZGVCdXR0b25zOwotCXByb3RlY3RlZCBpbnQgbGF1bmNoTW9kZTI7Ci0JcHJvdGVjdGVkIEJ1dHRvbltdIGxhdW5jaE1vZGUyQnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IGJyZWFrcG9pbnRFbmFibGVtZW50OwotCXByb3RlY3RlZCBCdXR0b25bXSBicmVha3BvaW50QnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IHJlc3RhcnRFbmFibGVtZW50OwotCXByb3RlY3RlZCBCdXR0b25bXSByZXN0YXJ0QnV0dG9uczsKLQotCS8qKgotCSAqIFNlcnZlclByZWZlcmVuY2VzUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBMYXVuY2hpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXByZWZlcmVuY2VzID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKTsKLQkJdWlQcmVmZXJlbmNlcyA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJcHVibGlzaEJlZm9yZVN0YXJ0ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZBdXRvUHVibGlzaCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmlzQXV0b1B1Ymxpc2hpbmcoKSk7Ci0JCXdocy5zZXRIZWxwKHB1Ymxpc2hCZWZvcmVTdGFydCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfUFVCTElTSF9CRUZPUkVfU1RBUlQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVTYXZlRWRpdG9yR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCWNyZWF0ZUxhdW5jaE1vZGVHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlTGF1bmNoTW9kZTJHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlQnJlYWtwb2ludHNHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlUmVzdGFydEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRTYXZlRWRpdG9yU3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0U2F2ZUVkaXRvcnMoKSk7Ci0JCXNldExhdW5jaE1vZGVTdGF0dXModWlQcmVmZXJlbmNlcy5nZXRMYXVuY2hNb2RlKCkpOwotCQlzZXRMYXVuY2hNb2RlMlN0YXR1cyh1aVByZWZlcmVuY2VzLmdldExhdW5jaE1vZGUyKCkpOwotCQlzZXRCcmVha3BvaW50c1N0YXR1cyh1aVByZWZlcmVuY2VzLmdldEVuYWJsZUJyZWFrcG9pbnRzKCkpOwotCQlzZXRSZXN0YXJ0U3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0UmVzdGFydCgpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2F2ZUVkaXRvckdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKLQkJCU1lc3NhZ2VzLnByZWZTYXZlRWRpdG9yc0Fsd2F5cywgTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzTmV2ZXIsCi0JCQlNZXNzYWdlcy5wcmVmU2F2ZUVkaXRvcnNQcm9tcHQKLQkJfTsKLQkJCi0JCWZpbmFsIGJ5dGVbXSBvcHRpb25zID0gbmV3IGJ5dGVbXSB7Ci0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19BTFdBWVMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19ORVZFUiwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVAotCQl9OwotCQkKLQkJQnV0dG9uW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bM107Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJYnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlidXR0b25zW2ldLnNldFRleHQobWVzc2FnZXNbaV0pOwotCQkJZmluYWwgaW50IGIgPSBpOwotCQkJYnV0dG9uc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzYXZlRWRpdG9ycyA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9TQVZFX0VESVRPUlMpOwotCQl9Ci0JCXNhdmVCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTYXZlRWRpdG9yU3RhdHVzKGJ5dGUgc3RhdHVzKSB7Ci0JCXNhdmVFZGl0b3JzID0gc3RhdHVzOwotCQlzYXZlQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oc2F2ZUVkaXRvcnMgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfQUxXQVlTKTsKLQkJc2F2ZUJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX05FVkVSKTsKLQkJc2F2ZUJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGF1bmNoTW9kZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW10gewotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGVSZXN0YXJ0LCBNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZUNvbnRpbnVlLAotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGVQcm9tcHQKLQkJfTsKLQkJCi0JCWZpbmFsIGJ5dGVbXSBvcHRpb25zID0gbmV3IGJ5dGVbXSB7Ci0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX0NPTlRJTlVFLAotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9QUk9NUFQKLQkJfTsKLQkJCi0JCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKLQkJCWZpbmFsIGludCBiID0gaTsKLQkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJbGF1bmNoTW9kZSA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERSk7Ci0JCX0KLQkJbGF1bmNoTW9kZUJ1dHRvbnMgPSBidXR0b25zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExhdW5jaE1vZGVTdGF0dXMoaW50IG1vZGUpIHsKLQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCWxhdW5jaE1vZGVCdXR0b25zWzBdLnNldFNlbGVjdGlvbihsYXVuY2hNb2RlID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfUkVTVEFSVCk7Ci0JCWxhdW5jaE1vZGVCdXR0b25zWzFdLnNldFNlbGVjdGlvbihsYXVuY2hNb2RlID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpOwotCQlsYXVuY2hNb2RlQnV0dG9uc1syXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZSA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1BST01QVCk7IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxhdW5jaE1vZGUyR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZTIpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW10gewotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyUmVzdGFydCwgTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyQnJlYWtwb2ludHMsCi0JCQlNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZTJDb250aW51ZSwgTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyUHJvbXB0Ci0JCX07Ci0JCQotCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10gewotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0RJU0FCTEVfQlJFQUtQT0lOVFMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9DT05USU5VRSwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1BST01QVAotCQl9OwotCQkKLQkJQnV0dG9uW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bNF07Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJYnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlidXR0b25zW2ldLnNldFRleHQobWVzc2FnZXNbaV0pOwotCQkJZmluYWwgaW50IGIgPSBpOwotCQkJYnV0dG9uc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlsYXVuY2hNb2RlMiA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERV9ERUJVRyk7Ci0JCX0KLQkJbGF1bmNoTW9kZTJCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXVuY2hNb2RlMlN0YXR1cyhpbnQgbW9kZSkgewotCQlsYXVuY2hNb2RlMiA9IG1vZGU7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCk7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUyk7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1syXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfQ09OVElOVUUpOwotCQlsYXVuY2hNb2RlMkJ1dHRvbnNbM10uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUyID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1BST01QVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnJlYWtwb2ludHNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZCcmVha3BvaW50cyk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlTdHJpbmdbXSBtZXNzYWdlcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlNZXNzYWdlcy5wcmVmQnJlYWtwb2ludHNBbHdheXMsIE1lc3NhZ2VzLnByZWZCcmVha3BvaW50c05ldmVyLAotCQkJTWVzc2FnZXMucHJlZkJyZWFrcG9pbnRzUHJvbXB0Ci0JCX07Ci0JCQotCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10gewotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTLAotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfTkVWRVIsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19QUk9NUFQKLQkJfTsKLQkJCi0JCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKLQkJCWZpbmFsIGludCBiID0gaTsKLQkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJYnJlYWtwb2ludEVuYWJsZW1lbnQgPSBvcHRpb25zW2JdOwotCQkJCX0KLQkJCX0pOwotCQkJd2hzLnNldEhlbHAoYnV0dG9uc1tpXSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfRU5BQkxFX0JSRUFLUE9JTlRTKTsKLQkJfQotCQlicmVha3BvaW50QnV0dG9ucyA9IGJ1dHRvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnJlYWtwb2ludHNTdGF0dXMoaW50IG1vZGUpIHsKLQkJYnJlYWtwb2ludEVuYWJsZW1lbnQgPSBtb2RlOwotCQlicmVha3BvaW50QnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oYnJlYWtwb2ludEVuYWJsZW1lbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTKTsKLQkJYnJlYWtwb2ludEJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKGJyZWFrcG9pbnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSKTsKLQkJYnJlYWtwb2ludEJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKGJyZWFrcG9pbnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVCk7IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc3RhcnRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZSZXN0YXJ0KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKLQkJCU1lc3NhZ2VzLnByZWZSZXN0YXJ0QWx3YXlzLCBNZXNzYWdlcy5wcmVmUmVzdGFydE5ldmVyLCBNZXNzYWdlcy5wcmVmUmVzdGFydFByb21wdAotCQl9OwotCQkKLQkJZmluYWwgYnl0ZVtdIG9wdGlvbnMgPSBuZXcgYnl0ZVtdIHsKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfTkVWRVIsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfUFJPTVBUCi0JCX07Ci0JCQotCQlCdXR0b25bXSBidXR0b25zID0gbmV3IEJ1dHRvblszXTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlidXR0b25zW2ldID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJCWJ1dHRvbnNbaV0uc2V0VGV4dChtZXNzYWdlc1tpXSk7Ci0JCQlmaW5hbCBpbnQgYiA9IGk7Ci0JCQlidXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJlc3RhcnRFbmFibGVtZW50ID0gb3B0aW9uc1tiXTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKGJ1dHRvbnNbaV0sIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1JFU1RBUlQpOwotCQl9Ci0JCXJlc3RhcnRCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN0YXJ0U3RhdHVzKGludCBtb2RlKSB7Ci0JCXJlc3RhcnRFbmFibGVtZW50ID0gbW9kZTsKLQkJcmVzdGFydEJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHJlc3RhcnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpOwotCQlyZXN0YXJ0QnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24ocmVzdGFydEVuYWJsZW1lbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSKTsKLQkJcmVzdGFydEJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKHJlc3RhcnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9QUk9NUFQpOyAKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkpOwotCQkKLQkJc2V0U2F2ZUVkaXRvclN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRTYXZlRWRpdG9ycygpKTsKLQkJc2V0TGF1bmNoTW9kZVN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRMYXVuY2hNb2RlKCkpOwotCQlzZXRMYXVuY2hNb2RlMlN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRMYXVuY2hNb2RlMigpKTsKLQkJc2V0QnJlYWtwb2ludHNTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RW5hYmxlQnJlYWtwb2ludHMoKSk7Ci0JCXNldFJlc3RhcnRTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UmVzdGFydCgpKTsKLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXByZWZlcmVuY2VzLnNldEF1dG9QdWJsaXNoaW5nKHB1Ymxpc2hCZWZvcmVTdGFydC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0U2F2ZUVkaXRvcnMoc2F2ZUVkaXRvcnMpOwotCQl1aVByZWZlcmVuY2VzLnNldExhdW5jaE1vZGUobGF1bmNoTW9kZSk7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0TGF1bmNoTW9kZTIobGF1bmNoTW9kZTIpOwotCQl1aVByZWZlcmVuY2VzLnNldEVuYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRFbmFibGVtZW50KTsKLQkJdWlQcmVmZXJlbmNlcy5zZXRSZXN0YXJ0KHJlc3RhcnRFbmFibGVtZW50KTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWEwNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjI7Ci0KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyIHsKLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgUnVudGltZU1hcmtlclJlc29sdXRpb24oKSB9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5M2RjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckFkZERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yVmVyc2lvbkxldmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vbml0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZU1hbnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTG9vc2VDb25maWd1cmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXJTdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENyZWF0ZVNlcnZlclByb2plY3RTdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTYXZlRXJyb3JEaWFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2F2ZUVycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seUZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRWRpdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVuZG9EaXNhYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JVbmRvRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWRvRGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVkb0VuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVzb3VyY2VEZWxldGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVNlcnZlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvdXJjZURpcnR5RGlhbG9nQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3UnVudGltZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaFNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJMYXVuY2hIb3N0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaFJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1NlcnZlclNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU2VydmVyQWxyZWFkeVJ1bm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENyZWF0ZVNlcnZlclByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdE5vdE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlByb2plY3ROb3RDb25maWd1cmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0Tm9TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcFNlcnZlckluZm9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BTZXJ2ZXJJbmZvVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wU2VydmVySW5mb1ZlbmRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVGlwRW5hYmxlRm9jdXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRpcERpc2FibGVGb2N1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90U2F2ZVByZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVJ1bnRpbWVzRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lU2VhcmNoTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lU2VhcmNoVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZm9Ob1J1bnRpbWVzRm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RWRpdFJ1bnRpbWVXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlUnVudGltZXNUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lSW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZURlbGV0ZVNlcnZlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVJlbW92ZVRhcmdldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VSdW50aW1lc1RpdGxlTG9uZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQXV0b1B1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGVSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZMYXVuY2hNb2RlQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGVQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZMYXVuY2hNb2RlMlJlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyQnJlYWtwb2ludHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZCcmVha3BvaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQnJlYWtwb2ludHNBbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkJyZWFrcG9pbnRzTmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkJyZWFrcG9pbnRzUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0QWx3YXlzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0TmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlJlc3RhcnRQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNob3dPbkFjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTYXZlRWRpdG9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNBbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzTmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25OZXdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvcGVydGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25PcGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNob3dJbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Db3B5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblBhc3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlYnVnVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1ZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1Z1Jlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdSZXN0YXJ0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvZmlsZVRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlUmVzdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVzdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QdWJsaXNoVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblB1Ymxpc2hDbGVhblRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHVibGlzaENsZWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1JlbW92ZU1vZHVsZUNvbmZpcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdPblNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUnVuT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3RvcE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SZXN0YXJ0TW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN3aXRjaFNlcnZlckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFNlcnZlckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFNlcnZlckxvY2F0aW9uTWV0YWRhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU2V0TmV3U2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9BcnRpZmFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vTW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaENvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ1J1bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0RlYnVnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ1Jlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9kZVdhcm5pbmdCcmVha3BvaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0JyZWFrcG9pbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0JyZWFrcG9pbnRzUmVlbmFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQnJlYWtwb2ludHNDb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSZW1lbWJlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc3RhcnRSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc3RhcnRDb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dQdWJsaXNoQ2xlYW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJvb3RNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaG9zdG5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBdmFpbGFibGVMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZURlcGxveWVkTGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFkZEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZW1vdmVBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVxdWlyZWRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVxdWlyZWRNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpUYXNrRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JJbnZhbGlkRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekVycm9yQ2xvc2VkUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZXJ2ZXJQcm9qZWN0RGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJTZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyTWFudWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdFNlcnZlclByZWZlcnJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJFeGlzdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelJ1bk9uU2VydmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RGVidWdPblNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelByb2ZpbGVPblNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFydGlmYWN0c0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFydGlmYWN0c0F2YWlsYWJsZUxpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlQXJ0aWZhY3RzTm9TZWxlY3Rpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3UnVudGltZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1J1bnRpbWVDcmVhdGVTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGVyZm9ybWluZ1Rhc2tzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlcldpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudFdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvck1vbml0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtblR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtblBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtbk1vbml0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWJTZXJ2aWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVDb21wVHJlZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmVSdW50aW1lczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRVbmtub3duTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJUeXBlQ29tcExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTmFtZURlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NlcnZlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld05vTW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3BUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9kaWZ5TW9kdWxlc1Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9kaWZ5TW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb25pdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdJbml0aWFsaXppbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNPa2F5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0UHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNPa2F5MjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1Jlc3RhcnQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUHVibGlzaDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0UHVibGlzaDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNQdWJsaXNoaW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTZXJ2ZXJFZGl0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUHJvbXB0SXJyZXZlcnNpYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlbmFtZUZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRWRpdG9yQ2FudFNhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcldyaXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlTW9kaWZpZWRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlV2FyblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlV2Fybk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2VNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERpc2FibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRJbnRlcnZhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0RGVzY3JpcHRpb247CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dENvbW1hbmQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1N0YXJ0VGltZW91dDsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTdG9wVGltZW91dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwZWQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwaW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkRGVidWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3BUb29sVGlwMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYXVuY2hpbmdDbGllbnRUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJDb25maXJtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVySm9iOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclNpdGVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhYmxlU2VydmVyTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckxvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekxpY2Vuc2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TGljZW5zZUFjY2VwdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlRGVjbGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JJbml0aWFsaXppbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iUmVzdGFydGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGllbnREZWZhdWx0TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGllbnREZWZhdWx0RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kdWxlRGVjb3JhdG9yUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaW51dGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydGluZ01vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmU2VsZWN0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZFbmFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmVm9sdW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlNvdW5kczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZTb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlBsYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmQnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlJlc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvVW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9EZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxXZWJCcm93c2VyTmFtZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWNmNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIC0tLS0tLS0tLS0tLS0tLSBXaXphcmRzIC0tLS0tLS0tLS0tLS0tLQotIyAoSWYgdGhlIGZpcnN0IHR3byBsaW5lcyBpbiBhIGdyb3VwIGRvIG5vdCBzdGFydCB3aXRoICJ3aXoiLCBpdCBpcyBiZWNhdXNlCi0jIHRob3NlIGxpbmVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIHdvcmtiZW5jaCAiTmV3IiB3aXphcmQuIFRoZSByZXN0IG9mIHRoZQotIyB0ZXh0IGlzIGRpc3BsYXllZCBpbiBlYWNoIGFjdHVhbCB3aXphcmQpCi0KLSMgTmV3IFNlcnZlciAoYW5kIENvbmZpZ3VyYXRpb24pIFdpemFyZAotd2l6TmV3U2VydmVyV2l6YXJkVGl0bGU9TmV3IFNlcnZlcgotd2l6TmV3U2VydmVyVGl0bGU9RGVmaW5lIGEgTmV3IFNlcnZlcgotd2l6TmV3U2VydmVyRGVzY3JpcHRpb249Q2hvb3NlIHRoZSB0eXBlIG9mIHNlcnZlciB0byBjcmVhdGUKLXdpek5ld1NlcnZlclJ1bk9uU2VydmVyRGVzY3JpcHRpb249U2VsZWN0IHdoaWNoIHNlcnZlciB0byB1c2UKLXdpek5ld1NlcnZlclJ1bnRpbWU9U2VydmVyICZydW50aW1lIGVudmlyb25tZW50Ogotd2l6TmV3U2VydmVyUnVudGltZUNyZWF0ZT1DcmVhdGUgYSBuZXcgcnVudGltZSBlbnZpcm9ubWVudAotCi13aXpOZXdTZXJ2ZXJTZWxlY3Q9SG93IGRvIHlvdSB3YW50IHRvIHNlbGVjdCB0aGUgc2VydmVyPwotd2l6TmV3U2VydmVyRXhpc3Rpbmc9Q2hvb3NlIGFuIGUmeGlzdGluZyBzZXJ2ZXIKLXdpek5ld1NlcnZlck1hbnVhbD0mTWFudWFsbHkgZGVmaW5lIGEgbmV3IHNlcnZlcgotd2l6TmV3U2VydmVyU2VsZWN0RXhpc3Rpbmc9U2VsZWN0IHRoZSBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB1c2U6Ci0KLSMgU2VsZWN0IFNlcnZlciB3aXphcmQKLXdpelJ1bk9uU2VydmVyVGl0bGU9UnVuIE9uIFNlcnZlcgotd2l6RGVidWdPblNlcnZlclRpdGxlPURlYnVnIE9uIFNlcnZlcgotd2l6UHJvZmlsZU9uU2VydmVyVGl0bGU9UHJvZmlsZSBPbiBTZXJ2ZXIKLXdpelNlbGVjdFNlcnZlclByZWZlcnJlZD1BbHdheXMgdXNlIHRoaXMgc2VydmVyIHdoZW4gcnVubmluZyB0aGlzICZwcm9qZWN0Ci0KLSMgU2VsZWN0IFNlcnZlciBDbGllbnQgV2l6YXJkCi13aXpTZWxlY3RDbGllbnRXaXphcmRUaXRsZT1TZWxlY3QgYSBTZXJ2ZXIgQ2xpZW50Ci13aXpTZWxlY3RDbGllbnRUaXRsZT1TZWxlY3QgYSBzZXJ2ZXIgY2xpZW50Ci13aXpTZWxlY3RDbGllbnREZXNjcmlwdGlvbj1TZWxlY3QgYSBjbGllbnQgdG8gdXNlIHdpdGggdGhpcyBzZXJ2ZXIuCi13aXpTZWxlY3RDbGllbnRNZXNzYWdlPU11bHRpcGxlIGNsaWVudHMgY2FuIHJ1biBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uIFNlbGVjdCBhIGNsaWVudCBmcm9tIHRoZSBsaXN0IGJlbG93OgotCi0jIFNlbGVjdCBNb2R1bGVBcnRpZmFjdCBXaXphcmQKLXdpek1vZHVsZUFydGlmYWN0c0Rlc2NyaXB0aW9uPVNwZWNpZnkgaG93IHRvIHN0YXJ0IHRoZSBzZWxlY3RlZCByZXNvdXJjZS4KLXdpek1vZHVsZUFydGlmYWN0c0F2YWlsYWJsZUxpc3Q9QXZhaWxhYmxlIGxhdW5jaGVyczoKLXdpek1vZHVsZUFydGlmYWN0c05vU2VsZWN0aW9uRXJyb3I9WW91IG11c3Qgc2VsZWN0IGEgbGF1bmNoZXIuCi0KLSMgVGFzayBXaXphcmQKLXdpelRhc2tXaXphcmRUaXRsZT1TZWxlY3QgVGFza3MKLXdpelRhc2tUaXRsZT1TZWxlY3QgVGFza3MKLXdpelRhc2tEZXNjcmlwdGlvbj1TZWxlY3QgdGhlIHRhc2tzIHRvIHBlcmZvcm0gb24gdGhlIHNlcnZlci4KLQotIyBOZXcgUnVudGltZSBXaXphcmQKLXdpek5ld1J1bnRpbWVXaXphcmRUaXRsZT1OZXcgU2VydmVyIFJ1bnRpbWUgRW52aXJvbm1lbnQKLXdpek5ld1J1bnRpbWVUaXRsZT1OZXcgU2VydmVyIFJ1bnRpbWUgRW52aXJvbm1lbnQKLXdpek5ld1J1bnRpbWVEZXNjcmlwdGlvbj1EZWZpbmUgYSBuZXcgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnQKLXdpek5ld1J1bnRpbWVDcmVhdGVTZXJ2ZXI9JkNyZWF0ZSBhIG5ldyBsb2NhbCBzZXJ2ZXIKLXdpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU9RWRpdCBTZXJ2ZXIgUnVudGltZSBFbnZpcm9ubWVudAotCi0jIE5ldyBTZXJ2ZXIgQWRhcHRlciBXaXphcmQKLXdpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGU9SW5zdGFsbCBOZXcgU2VydmVyIEFkYXB0ZXIKLXdpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb249RG93bmxvYWQgYW5kIGluc3RhbGwgc3VwcG9ydCBmb3IgYSBuZXcgc2VydmVyCi13aXpOZXdJbnN0YWxsYWJsZVNlcnZlck1lc3NhZ2U9VGhlIGZvbGxvd2luZyBzZXJ2ZXIgYWRhcHRlcnMgaGF2ZSBiZWVuIGZvdW5kIG9uIHJlbW90ZSB1cGRhdGUgbWFuYWdlciBzaXRlcy4gU2VsZWN0IGEgc2VydmVyIGFkYXB0ZXIgdG8gZG93bmxvYWQgYW5kIGluc3RhbGwuCi13aXpOZXdJbnN0YWxsYWJsZVNlcnZlckNvbmZpcm09U3VwcG9ydCBmb3IgezB9IHdpbGwgbm93IGJlIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZC4gWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gcmVzdGFydCBvbmNlIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGUuCi13aXpOZXdJbnN0YWxsYWJsZVNlcnZlckpvYj1JbnN0YWxsaW5nIHswfQotd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJSZXN0YXJ0PUluc3RhbGxhdGlvbiBjb21wbGV0ZS4gVGhlIG5ldyBzZXJ2ZXIgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSB3b3JrYmVuY2ggaXMgcmVzdGFydGVkLiBEbyB5b3Ugd2FudCB0byByZXN0YXJ0IG5vdz8KLXdpek5ld0luc3RhbGxhYmxlU2VydmVyU2l0ZUVycm9yPUNvdWxkIG5vdCBjb25uZWN0IHRvIHswfQotCi0jIExpY2Vuc2Ugd2l6YXJkCi13aXpMaWNlbnNlVGl0bGU9RmVhdHVyZSBMaWNlbnNlCi13aXpMaWNlbnNlRGVzY3JpcHRpb249VGhpcyBsaWNlbnNlIG11c3QgYmUgYWNjZXB0ZWQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgaW5zdGFsbGF0aW9uLgotd2l6TGljZW5zZUFjY2VwdD1JICZhY2NlcHQgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGFncmVlbWVudAotd2l6TGljZW5zZURlY2xpbmU9SSAmZG8gbm90IGFjY2VwdCB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgYWdyZWVtZW50Ci13aXpMaWNlbnNlTm9uZT1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBsaWNlbnNlLgotCi0jIEFkZC9SZW1vdmUgTW9kdWxlcwotd2l6TW9kdWxlV2l6YXJkVGl0bGU9QWRkIGFuZCBSZW1vdmUgUHJvamVjdHMKLXdpek1vZHVsZVRpdGxlPUFkZCBhbmQgUmVtb3ZlIFByb2plY3RzCi13aXpNb2R1bGVEZXNjcmlwdGlvbj1Nb2RpZnkgdGhlIHByb2plY3RzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIHNlcnZlcgotd2l6TW9kdWxlTWVzc2FnZT1Nb3ZlIHByb2plY3RzIHRvIHRoZSByaWdodCB0byBjb25maWd1cmUgdGhlbSBvbiB0aGUgc2VydmVyCi13aXpNb2R1bGVBdmFpbGFibGVMaXN0PSZBdmFpbGFibGUgcHJvamVjdHM6Ci13aXpNb2R1bGVEZXBsb3llZExpc3Q9JkNvbmZpZ3VyZWQgcHJvamVjdHM6Ci13aXpNb2R1bGVBZGQ9QSZkZCA+Ci13aXpNb2R1bGVBZGRBbGw9QWRkIEEmbGwgPj4KLXdpek1vZHVsZVJlbW92ZT08ICZSZW1vdmUKLXdpek1vZHVsZVJlbW92ZUFsbD08PCBSZSZtb3ZlIEFsbAotd2l6TW9kdWxlUmVxdWlyZWRNb2R1bGU9ezB9IGlzIHJlcXVpcmVkIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIKLXdpek1vZHVsZVJlcXVpcmVkTW9kdWxlcz1PbmUgb2YgdGhlIHJlcXVpcmVkIG1vZHVsZXMgKHswfSkgbXVzdCBiZSBhZGRlZCB0byB0aGUgc2VydmVyCi0KLSMgV2l6YXJkIGluZm8gYW5kIGVycm9yIG1lc3NhZ2VzCi13aXpFcnJvckludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBtdXN0IGJlIGEgc2VydmVyIHByb2plY3Qgb3IgYSBmb2xkZXIgd2l0aGluIGEgc2VydmVyIHByb2plY3QKLXdpekVycm9yQ2xvc2VkUHJvamVjdD1UaGUgZm9sZGVyIG11c3Qgbm90IGJlIGluIGEgY2xvc2VkIHByb2plY3QKLXdpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvcj1DYW5ub3QgY3JlYXRlIGEgc2VydmVyIHVzaW5nIHRoZSBzZWxlY3RlZCB0eXBlCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0gVmlld3MgLS0tLS0tLS0tLS0tLS0tCi0KLSMgLS0tIFNlcnZlciBDb25maWd1cmF0aW9uIHZpZXcgLS0tCi12aWV3U2VydmVycz1TZXJ2ZXJzCi0KLXZpZXdOb01vZHVsZXM9Tm90aGluZyBkZXBsb3llZAotCi0jIEFjdGlvbnMKLWFjdGlvbkRlbGV0ZT1EZWxldGUKLWFjdGlvblJlbW92ZT1SZW1vdmUKLWFjdGlvbk9wZW49T3BlbgotYWN0aW9uU2hvd0luPVNob3cgSW4KLWFjdGlvbkNvcHk9Q29weQotYWN0aW9uUGFzdGU9UGFzdGUKLWFjdGlvbk1vbml0b3I9TW9uaXRvcmluJmcKLWFjdGlvbk1vbml0b3JQb3J0PU1vbml0b3IgcG9ydCB7MH0gKHsxfSkKLWFjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcwotYWN0aW9uTmV3PU5lJncKLWFjdGlvbk5ld1NlcnZlcj1TZXJ2ZXIKLQotIyAtLS0gU2VydmVycyB2aWV3IC0tLQotdmlld0luaXRpYWxpemluZz1Jbml0aWFsaXppbmcuLi4KLQotIyBDb2x1bW4gdGl0bGVzCi12aWV3U2VydmVyPVNlcnZlcgotdmlld1N0YXR1cz1TdGF0dXMKLXZpZXdTdGF0ZT1TdGF0ZQotCi0jIEFjdGlvbnMKLWFjdGlvblN0YXJ0PSZTdGFydAotYWN0aW9uU3RhcnRUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIKLWFjdGlvbkRlYnVnPSZEZWJ1ZwotYWN0aW9uRGVidWdUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gZGVidWcgbW9kZQotYWN0aW9uRGVidWdSZXN0YXJ0PVJlc3RhcnQgaW4gRGVidWcKLWFjdGlvbkRlYnVnUmVzdGFydFRvb2xUaXA9UmVzdGFydCB0aGUgc2VydmVyIGluIGRlYnVnIG1vZGUKLWFjdGlvblByb2ZpbGU9UHJvJmZpbGUKLWFjdGlvblByb2ZpbGVUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gcHJvZmlsaW5nIG1vZGUKLWFjdGlvblByb2ZpbGVSZXN0YXJ0PVJlc3RhcnQgaW4gUHJvZmlsZQotYWN0aW9uUHJvZmlsZVJlc3RhcnRUb29sVGlwPVJlc3RhcnQgdGhlIHNlcnZlciBpbiBwcm9maWxpbmcgbW9kZQotYWN0aW9uU3RvcD1TJnRvcAotYWN0aW9uU3RvcFRvb2xUaXA9U3RvcCB0aGUgc2VydmVyCi1hY3Rpb25SZXN0YXJ0PSZSZXN0YXJ0Ci1hY3Rpb25SZXN0YXJ0VG9vbFRpcD1SZXN0YXJ0IHRoZSBzZXJ2ZXIKLWFjdGlvblB1Ymxpc2g9UHVibGlzaAotYWN0aW9uUHVibGlzaFRvb2xUaXA9UHVibGlzaCB0byB0aGUgc2VydmVyCi1hY3Rpb25QdWJsaXNoQ2xlYW49JkNsZWFuLi4uCi1hY3Rpb25QdWJsaXNoQ2xlYW5Ub29sVGlwPUNsZWFuIHByb2plY3RzIG9uIHRoZSBzZXJ2ZXIKLWFjdGlvbk1vZGlmeU1vZHVsZXM9QWRkIGFuZCBSZW1vdmUgJlByb2plY3RzLi4uCi1hY3Rpb25Nb2RpZnlNb2R1bGVzVG9vbFRpcD1BZGQgYW5kIHJlbW92ZSBwcm9qZWN0cwotYWN0aW9uUmVzdGFydE1vZHVsZT0mUmVzdGFydAotYWN0aW9uU3RhcnRNb2R1bGU9JlN0YXJ0Ci1hY3Rpb25TdG9wTW9kdWxlPVMmdG9wCi1hY3Rpb25Td2l0Y2hTZXJ2ZXJMb2NhdGlvbj1Td2l0Y2ggTG9jYXRpb24KLXN3aXRjaFNlcnZlckxvY2F0aW9uPUxvY2F0aW9uOgotc3dpdGNoU2VydmVyTG9jYXRpb25NZXRhZGF0YT1bd29ya3NwYWNlIG1ldGFkYXRhXQotYWN0aW9uUmVuYW1lPVJlJm5hbWUKLQotIyBTdGF0dXMgY29sdW1uIHRleHQKLXZpZXdTdGF0dXNTdGFydGVkPVN0YXJ0ZWQKLXZpZXdTdGF0dXNTdGFydGVkRGVidWc9RGVidWdnaW5nCi12aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU9UHJvZmlsaW5nCi12aWV3U3RhdHVzU3RvcHBlZD1TdG9wcGVkCi0KLXZpZXdTdGF0dXNTdGFydGluZzE9U3RhcnRpbmcuCi12aWV3U3RhdHVzU3RhcnRpbmcyPVN0YXJ0aW5nLi4KLXZpZXdTdGF0dXNTdGFydGluZzM9U3RhcnRpbmcuLi4KLQotdmlld1N0YXR1c1N0b3BwaW5nMT1TdG9wcGluZy4KLXZpZXdTdGF0dXNTdG9wcGluZzI9U3RvcHBpbmcuLgotdmlld1N0YXR1c1N0b3BwaW5nMz1TdG9wcGluZy4uLgotCi0jIFNlcnZlciBTdGF0ZSB0ZXh0Ci12aWV3U3luY09rYXk9U3luY2hyb25pemVkCi12aWV3U3luY1Jlc3RhcnQ9UmVzdGFydAotdmlld1N5bmNQdWJsaXNoPVJlcHVibGlzaAotdmlld1N5bmNSZXN0YXJ0UHVibGlzaD1SZXN0YXJ0ICYgcmVwdWJsaXNoCi12aWV3U3luY1B1Ymxpc2hpbmc9UHVibGlzaGluZy4uLgotCi0jIC0tLSBzZXQgMiAtLS0KLSMgQWN0aW9ucwotYWN0aW9uU3RvcDI9RGlzY29ubmVjdAotYWN0aW9uU3RvcFRvb2xUaXAyPURpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyCi0KLSMgU3RhdHVzIGNvbHVtbiB0ZXh0Ci12aWV3U3RhdHVzU3RhcnRpbmc0PUNvbm5lY3RpbmcKLXZpZXdTdGF0dXNTdGFydGVkMj1Db25uZWN0ZWQKLXZpZXdTdGF0dXNTdG9wcGluZzQ9RGlzY29ubmVjdGluZwotdmlld1N0YXR1c1N0b3BwZWQyPURpc2Nvbm5lY3RlZAotCi0jIFNlcnZlciBTdGF0ZSB0ZXh0Ci12aWV3U3luY09rYXkyPVN5bmNocm9uaXplZAotdmlld1N5bmNSZXN0YXJ0Mj1SZWNvbm5lY3QKLXZpZXdTeW5jUHVibGlzaDI9UmVwdWJsaXNoCi12aWV3U3luY1Jlc3RhcnRQdWJsaXNoMj1SZWNvbm5lY3QgYW5kIHJlcHVibGlzaAotdmlld1N5bmNQdWJsaXNoaW5nMj1QdWJsaXNoaW5nLi4uCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0gQWN0aW9uIFNldHMgKHRvb2xiYXIgaWNvbiBncm91cHMpIC0tLS0tLS0tLS0tLS0tLQotCi0jIFNlcnZlcnMgYWN0aW9uIHNldAotYWN0aW9uU2V0TmV3U2VydmVyPUNyZWF0ZSBTZXJ2ZXIKLQotIyBSdW4gb24gU2VydmVyIGFjdGlvbnMKLWFjdGlvblJ1bk9uU2VydmVyPVJ1biBvbiBTZXJ2ZXIuLi4KLWFjdGlvbkRlYnVnT25TZXJ2ZXI9RGVidWcgb24gU2VydmVyLi4uCi1hY3Rpb25Qcm9maWxlT25TZXJ2ZXI9UHJvZmlsZSBvbiBTZXJ2ZXIuLi4KLXByb2Nlc3NOYW1lPVJ1biBvbiBTZXJ2ZXIKLQotCi0jIC0tLS0tLS0tLS0tLS0tLSBQcmVmZXJlbmNlcyAtLS0tLS0tLS0tLS0tLS0KLQotIyBOYW1lcyBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlcwotcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGVMb25nPVNlcnZlciBSdW50aW1lIEVudmlyb25tZW50cwotCi0jIFNlcnZlciBwcmVmZXJlbmNlcwotcHJlZkF1dG9QdWJsaXNoPUF1dG9tYXRpY2FsbHkgcHVibGlzaCB3JmhlbiBzdGFydGluZyBzZXJ2ZXJzCi1wcmVmU2hvd09uQWN0aXZpdHk9U2hvdyAmU2VydmVycyB2aWV3IHdoZW4gc2VydmVyIHN0YXRlIGNoYW5nZXMKLQotcHJlZlNhdmVFZGl0b3JzPVNhdmUgZGlydHkgZWRpdG9ycyBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlcgotcHJlZlNhdmVFZGl0b3JzQWx3YXlzPUEmbHdheXMKLXByZWZTYXZlRWRpdG9yc05ldmVyPSZOZXZlcgotcHJlZlNhdmVFZGl0b3JzUHJvbXB0PSZQcm9tcHQKLQotcHJlZkxhdW5jaE1vZGU9V2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgc2VydmVyIG1vZGUKLXByZWZMYXVuY2hNb2RlUmVzdGFydD1SZSZzdGFydAotcHJlZkxhdW5jaE1vZGVDb250aW51ZT0mQ29udGludWUKLXByZWZMYXVuY2hNb2RlUHJvbXB0PVAmcm9tcHQKLQotcHJlZkxhdW5jaE1vZGUyPVdoZW4gc3dpdGNoaW5nIHRoZSBzZXJ2ZXIgb3V0IG9mIGRlYnVnIG1vZGUKLXByZWZMYXVuY2hNb2RlMlJlc3RhcnQ9UmVzdCZhcnQKLXByZWZMYXVuY2hNb2RlMkJyZWFrcG9pbnRzPURpc2FibGUgJmJyZWFrcG9pbnRzCi1wcmVmTGF1bmNoTW9kZTJDb250aW51ZT1Db250aW4mdWUKLXByZWZMYXVuY2hNb2RlMlByb21wdD1QciZvbXB0Ci0KLXByZWZCcmVha3BvaW50cz1XaGVuIHN3aXRjaGluZyB0aGUgc2VydmVyIGludG8gZGVidWcgbW9kZSwgcmUtZW5hYmxlIGJyZWFrcG9pbnRzCi1wcmVmQnJlYWtwb2ludHNBbHdheXM9QWwmd2F5cwotcHJlZkJyZWFrcG9pbnRzTmV2ZXI9TiZldmVyCi1wcmVmQnJlYWtwb2ludHNQcm9tcHQ9UHJvJm1wdAotCi1wcmVmUmVzdGFydD1XaGVuIHJlcXVpcmVkLCByZXN0YXJ0IHRoZSBzZXJ2ZXIKLXByZWZSZXN0YXJ0QWx3YXlzPUFsd2EmeXMKLXByZWZSZXN0YXJ0TmV2ZXI9TmUmdmVyCi1wcmVmUmVzdGFydFByb21wdD1Qcm9tcCZ0Ci0KLSMgUHJvamVjdCBwcm9wZXJ0aWVzIHByZWZlcmVuY2VzCi1wcmVmUHJvamVjdD1Qcm9qZWN0OgotcHJlZlByb2plY3REZWZhdWx0U2VydmVyPUFsd2F5cyB1c2UgdGhlICZmb2xsb3dpbmcgc2VydmVyIHdoZW4gcnVubmluZyB0aGlzIHByb2plY3Q6Ci1wcmVmUHJvamVjdE5vdE1vZHVsZT1UaGlzIHByb2plY3QgY2Fubm90IGJlIHVzZWQgd2l0aCBzZXJ2ZXJzLgotcHJlZlByb2plY3ROb3RDb25maWd1cmVkPVRoaXMgcHJvamVjdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBzZXJ2ZXJzLgotcHJlZlByb2plY3ROb1NlcnZlcj08Tm9uZT4KLQotcHJvcFNlcnZlckluZm9OYW1lPU5hbWU6Ci1wcm9wU2VydmVySW5mb1R5cGU9VHlwZToKLXByb3BTZXJ2ZXJJbmZvVmVuZG9yPVZlbmRvcjoKLQotIyBUb29sdGlwCi10b29sVGlwRW5hYmxlRm9jdXM9UHJlc3MgJ0Y2JyBmb3IgRm9jdXMuCi10b29sVGlwRGlzYWJsZUZvY3VzPVByZXNzICdFU0MnIHRvIEhpZGUuCi0KLSMgUnVudGltZSBFbnZpcm9ubWVudHMKLXByZWZlcmVuY2VSdW50aW1lc0Rlc2NyaXB0aW9uPUFkZCwgcmVtb3ZlLCBvciBlZGl0IHNlcnZlciBydW50aW1lIGVudmlyb25tZW50cy4KLXByZWZlcmVuY2VSdW50aW1lc1RhYmxlPVNlcnZlciBydW50aW1lIGUmbnZpcm9ubWVudHM6Ci0KLQotIyAtLS0tLS0tLS0tLS0tLS0gVGFza3MgKHByb2dyZXNzIG1vbml0b3JzKSAtLS0tLS0tLS0tLS0tLS0KLQotIyBHZW5lcmFsIHRhc2tzCi1zYXZpbmdUYXNrPVNhdmluZyB7MH0uCi1sb2FkaW5nVGFzaz1Mb2FkaW5nIHswfS4KLXBlcmZvcm1pbmdUYXNrcz1QZXJmb3JtaW5nIHRhc2tzLgotbGF1bmNoaW5nQ2xpZW50VGFzaz1MYXVuY2hpbmcgY2xpZW50Ci1qb2JJbml0aWFsaXppbmc9SW5pdGlhbGl6aW5nIFNlcnZlciBUb29scwotam9iUmVzdGFydGluZz1SZXN0YXJ0aW5nIHswfQotam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXc9SW5pdGlhbGl6aW5nIFNlcnZlcnMgdmlldwotCi0jIC0tLS0tLS0tLS0tLS0tLSBEaWFsb2dzIC0tLS0tLS0tLS0tLS0tLQotCi0jIERlbGV0ZSBTZXJ2ZXIgZGlhbG9nCi1kZWxldGVTZXJ2ZXJEaWFsb2dUaXRsZT1EZWxldGUgU2VydmVyCi1kZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgezB9PwotZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZU1hbnk9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgezB9IHNlcnZlcnM/Ci1kZWxldGVTZXJ2ZXJEaWFsb2dMb29zZUNvbmZpZ3VyYXRpb25zPURlbGV0ZSB1bnVzZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24ocykKLWRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXI9RGVsZXRlIHJ1bm5pbmcgc2VydmVyKHMpCi1kZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyU3RvcD1TdG9wIHNlcnZlcihzKSBiZWZvcmUgZGVsZXRpbmcKLWRlbGV0ZVNlcnZlclRhc2s9RGVsZXRpbmcgc2VydmVyKHMpLi4uCi0KLSMgQ3JlYXRlIFNlcnZlciBQcm9qZWN0IGRpYWxvZwotY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ1RpdGxlPUNyZWF0ZSBTZXJ2ZXIgUHJvamVjdAotY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ01lc3NhZ2U9RG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHNlcnZlciBwcm9qZWN0IHdpdGggdGhlIG5hbWUgezB9PwotCi0jIFRlcm1pbmF0ZSBTZXJ2ZXIgZGlhbG9nCi10ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dUaXRsZT1UZXJtaW5hdGUgU2VydmVyCi10ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlPVNlcnZlciB7MH0gaXMgbm90IHJlc3BvbmRpbmcuIERvIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGlzIHNlcnZlcj8gQ2xpY2sgT0sgdG8gdGVybWluYXRlIHRoZSBzZXJ2ZXIgb3IgY2xpY2sgQ2FuY2VsIHRvIGNvbnRpbnVlIHdhaXRpbmcuCi0KLSMgU2VydmVyIHJlc291cmNlIGRpcnR5IGRpYWxvZwotcmVzb3VyY2VEaXJ0eURpYWxvZ1RpdGxlPVNlcnZlciBSZXNvdXJjZSBEaXJ0eQotcmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2U9VGhlIHNlcnZlciByZXNvdXJjZSB7MH0gaGFzIHVuc2F2ZWQgY2hhbmdlcy4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1yZXNvdXJjZURpcnR5RGlhbG9nQ29udGludWU9Q29udGludWUKLQotIyBHZW5lcmFsIGRpYWxvZ3MKLWRlZmF1bHREaWFsb2dUaXRsZT1TZXJ2ZXIKLWRpYWxvZ1JlbWVtYmVyPSZSZW1lbWJlciBteSBkZWNpc2lvbgotCi0jIHJlc3RhcnQgd2FybmluZyBkaWFsb2cKLWRpYWxvZ01vZGVXYXJuaW5nUnVuPVRoZSBzZXJ2ZXIgaXMgbm90IGluIHJ1biBtb2RlLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotZGlhbG9nTW9kZVdhcm5pbmdEZWJ1Zz1UaGUgc2VydmVyIGlzIG5vdCBydW5uaW5nIGluIGRlYnVnIG1vZGUuIFNlbGVjdCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci1kaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGU9VGhlIHNlcnZlciBpcyBub3QgcnVubmluZyBpbiBwcm9maWxpbmcgbW9kZS4gU2VsZWN0IGZyb20gb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLWRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydD0mU3dpdGNoIG1vZGUgKHdpbGwgcmVzdGFydCBpZiBuZWNlc3NhcnkpCi1kaWFsb2dNb2RlV2FybmluZ0JyZWFrcG9pbnRzPURpc2FibGUgJmJyZWFrcG9pbnRzIGFuZCBjb250aW51ZQotZGlhbG9nTW9kZVdhcm5pbmdDb250aW51ZT0mQ29udGludWUgaW4gdGhlIGN1cnJlbnQgbW9kZQotCi1kaWFsb2dCcmVha3BvaW50cz1UaGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSBidXQgYnJlYWtwb2ludHMgaGF2ZSBiZWVuIGRpc2FibGVkLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotZGlhbG9nQnJlYWtwb2ludHNSZWVuYWJsZT1SZS0mZW5hYmxlIGJyZWFrcG9pbnRzCi1kaWFsb2dCcmVha3BvaW50c0NvbnRpbnVlPSZDb250aW51ZSB3aXRob3V0IGRlYnVnZ2luZwotCi1kaWFsb2dSZXN0YXJ0PVRoZSBzZXJ2ZXIgbWF5IG5lZWQgYmUgcmVzdGFydGVkLiBEbyB5b3Ugd2FudCB0byByZXN0YXJ0IHRoZSBzZXJ2ZXI/Ci1kaWFsb2dSZXN0YXJ0UmVzdGFydD1SZSZzdGFydCBzZXJ2ZXIKLWRpYWxvZ1Jlc3RhcnRDb250aW51ZT0mQ29udGludWUgd2l0aG91dCByZXN0YXJ0aW5nCi0KLSMgTW9uaXRvciBkaWFsb2cKLWRpYWxvZ01vbml0b3JUaXRsZT1Nb25pdG9yaW5nIFBvcnRzCi1kaWFsb2dNb25pdG9yRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBwb3J0cyBhcmUgYmVpbmcgbW9uaXRvcmVkIG9uIHNlcnZlciB7MH06Ci1kaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb249VGhlIHNlcnZlciB7MH0gaGFzIHRoZSBmb2xsb3dpbmcgcG9ydHMgdGhhdCBjYW4gYmUgbW9uaXRvcmVkOgotZGlhbG9nTW9uaXRvckNvbHVtblBvcnQ9U2VydmVyIFBvcnQKLWRpYWxvZ01vbml0b3JDb2x1bW5UeXBlPVR5cGUKLWRpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydD1Nb25pdG9yIFBvcnQKLWRpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZT1Db250ZW50IFR5cGUKLWRpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXM9U3RhdHVzCi1kaWFsb2dNb25pdG9yTW9uaXRvclBvcnQ9TW9uaXRvciBwb3J0OgotZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlPUNvbnRlbnQgdHlwZToKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZUFsbD1BbGwKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYj1XZWIKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYlNlcnZpY2VzPVdlYlNlcnZpY2VzCi1kaWFsb2dNb25pdG9yTm9uZT08bm9uZT4KLQotZGlhbG9nUHVibGlzaENsZWFuPUNsZWFuIHdpbGwgZGlzY2FyZCBhbGwgcHVibGlzaCBzdGF0ZSBhbmQgcmVwdWJsaXNoIGZyb20gc2NyYXRjaC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFuIGFsbCBwdWJsaXNoZWQgcHJvamVjdHM/Ci0KLXN0YXJ0PVN0YXJ0Ci1zdG9wPVN0b3AKLXN0YXJ0ZWQ9U3RhcnRlZAotc3RvcHBlZD1TdG9wcGVkCi0KLSMgQ29uZmlybSBydW50aW1lIHJlbW92YWwKLWRpYWxvZ1J1bnRpbWVJblVzZT1UaGUgcnVudGltZSBlbnZpcm9ubWVudCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBhbmQgZGVsZXRpbmcgaXQgd2lsbCBjYXVzZSBjb21waWxhdGlvbiBvciBydW4gdGltZSBwcm9ibGVtcy4gRGVsZXRlIHRoZSBydW50aW1lIGVudmlyb25tZW50IGFueXdheT8KLWRpYWxvZ1J1bnRpbWVEZWxldGVTZXJ2ZXJzPURlbGV0ZSBhbGwgYWZmZWN0ZWQgc2VydmVycz8KLWRpYWxvZ1J1bnRpbWVSZW1vdmVUYXJnZXRzPVJlbW92ZSB0aGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgZnJvbSB0YXJnZXRlZCBwcm9qZWN0cz8KLQotIyBydW50aW1lIGxvY2F0b3Igc2VhcmNoIGRpYWxvZwotZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlPVNlYXJjaCBGb3IgUnVudGltZSBFbnZpcm9ubWVudHMKLWRpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlPVNlbGVjdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzOgotZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzPVNlYXJjaGluZyBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCi0KLSMgQ2FuJ3QgYWRkIHJlbW92ZQotZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmU9VGhlcmUgYXJlIG5vIHByb2plY3RzIHRoYXQgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgc2VydmVyLgotCi1kaWFsb2dSZW1vdmVNb2R1bGVDb25maXJtPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgc2VydmVyPwotCi0jIC0tLS0tLS0tLS0tLS0tLSBNaXNjIFVJIC0tLS0tLS0tLS0tLS0tLQotCi0jIHJ1bnRpbWUgY29tcG9zaXRlCi1ydW50aW1lVHlwZUNvbXBUcmVlPVNlbGVjdCB0aGUgdHlwZSBvZiAmcnVudGltZSBlbnZpcm9ubWVudDoKLXNlcnZlclR5cGVDb21wTGFiZWw9U2VsZWN0IHRoZSAmc2VydmVyIHR5cGU6Ci1zZXJ2ZXJOYW1lPVNlcnZlciBuYSZtZToKLXNlcnZlck5hbWVEZWZhdWx0PVJlc2UmdCBkZWZhdWx0Ci1jb25maWd1cmVSdW50aW1lcz0mQ29uZmlndXJlIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCi1hZGRSdW50aW1lPSZBZGQuLi4KLQotIyBpbnN0YWxsYWJsZSBzZXJ2ZXIgY29tcG9zaXRlCi1pbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlPVNlbGVjdCB0aGUgJnNlcnZlciBzdXBwb3J0IHRvIGluc3RhbGw6Ci1pbnN0YWxsYWJsZVNlcnZlckxpbms9RG93bmxvYWQgYWRkaXRpb25hbCBzZXJ2ZXIgYWRhcHRlcnMKLWluc3RhbGxhYmxlU2VydmVyTG9jYWw9RXhhbWluaW5nIGxvY2FsIGNvbmZpZ3VyYXRpb24KLWluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nPVNlYXJjaGluZyB7MH0KLQotIyBtaXNjIGNvbXBvc2l0ZXMKLWhvc3RuYW1lPVNlcnZlcidzICZob3N0IG5hbWU6Ci0KLSMgU2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYgotc2VydmVyTGF1bmNoRGVzY3JpcHRpb249VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCB0byBsYXVuY2ggdGhlIHNlcnZlciBzcGVjaWZpZWQgYmVsb3cuIFRvIGFjY2VzcyBmdXJ0aGVyIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIsIG9wZW4gdGhlIHNlcnZlcidzIGVkaXRvciBmcm9tIHRoZSBTZXJ2ZXJzIHZpZXcuCi1zZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiPVNlcnZlcgotc2VydmVyTGF1bmNoU2VydmVyPVNlcnZlcjoKLXNlcnZlckxhdW5jaFJ1bnRpbWU9UnVudGltZSBFbnZpcm9ubWVudDoKLXNlcnZlckxhdW5jaEhvc3Q9SG9zdCBuYW1lOgotcnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lPXswfQotCi0jIEVycm9yIE1lc3NhZ2VzCi1lcnJvckRpYWxvZ1RpdGxlPVNlcnZlciBFcnJvcgotZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZz1TZXJ2ZXIgYWxyZWFkeSBydW5uaW5nCi1lcnJvck5vU2VydmVyU2VsZWN0ZWQ9Tm8gc2VydmVyIHNlbGVjdGVkCi1lcnJvckludmFsaWRTZXJ2ZXI9VGhlIHNlcnZlciBpcyBpbnZhbGlkIG9yIG1pc3NpbmcKLWVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0PUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3QKLWVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0U3RhdHVzPUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3Q6IHswfQotZXJyb3JOb0FydGlmYWN0PVRoZSBzZWxlY3Rpb24gZGlkIG5vdCBjb250YWluIGFueSByZXNvdXJjZXMgdGhhdCBjYW4gcnVuIG9uIGEgc2VydmVyLgotZXJyb3JMYXVuY2hDb25maWc9VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIGFuZCBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgd29ya3NwYWNlCi1lcnJvck5vTW9kdWxlcz1UaGUgc2VsZWN0aW9uIGlzIG5vdCB3aXRoaW4gYSB2YWxpZCBtb2R1bGUuCi1lcnJvck5vU2VydmVyPVRoZSBzZWxlY3Rpb24gY2Fubm90IGJlIHJ1biBvbiBhbnkgc2VydmVyLgotZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlPUNvdWxkIG5vdCBzYXZlIHNlcnZlciBwcmVmZXJlbmNlIGluZm9ybWF0aW9uLgotZXJyb3JFZGl0b3JDYW50U2F2ZT1UaGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgotZXJyb3JFZGl0b3I9Q291bGQgbm90IG9wZW4gZWRpdG9yIGJlY2F1c2UgezB9IGlzIG5vdCBhIHZhbGlkIHNlcnZlci4gVXNlIE9wZW4gV2l0aCB0byBvcGVuIHRoaXMgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvci4KLWVycm9yVmVyc2lvbkxldmVsPVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uIHsxfSBvZiB0aGUgezB9IHNwZWNpZmljYXRpb24uCi1lcnJvck1pc3NpbmdDb25maWd1cmF0aW9uPVRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIG9yIGludmFsaWQKLWVycm9yUm9vdE1vZHVsZT1Db3VsZCBub3QgZmluZCBhIHZhbGlkIHBhcmVudCBtb2R1bGUgdG8gYWRkIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvckR1cGxpY2F0ZU5hbWU9VGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuIFNwZWNpZnkgYSBkaWZmZXJlbnQgbmFtZS4KLQotIyBJbmZvIG1lc3NhZ2VzCi1pbmZvTm9SdW50aW1lc0ZvdW5kPU5vIG5ldyBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHMgd2VyZSBmb3VuZC4KLQotIyBEZWZhdWx0IHNlcnZlciBjcmVhdGlvbiBuYW1lcwotIyB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBhIG51bWJlciBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKLWRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZT1TZXJ2ZXJzezB9Ci0KLSMgVXNlZCB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZAotZWxlbWVudFVua25vd25OYW1lPTx1bmtub3duPgotCi1jb2x1bW5OYW1lPU5hbWUKLWNvbHVtblR5cGU9VHlwZQotCi1hZGQ9JkFkZC4uLgotZWRpdD0mRWRpdC4uLgotcmVtb3ZlPSZSZW1vdmUKLXNlYXJjaD0mU2VhcmNoLi4uCi0KLWNsaWVudERlZmF1bHROYW1lPURvIG5vdGhpbmcKLWNsaWVudERlZmF1bHREZXNjcmlwdGlvbj1MYXVuY2ggdGhlIG1vZHVsZSBvbiB0aGUgc2VydmVyIGJ1dCBkbyBub3QgYnJpbmcgdXAgYSBjbGllbnQgYXBwbGljYXRpb24uCi0KLSMgTW9kdWxlIGRlY29yYXRvcgotbW9kdWxlRGVjb3JhdG9yUHJvamVjdD17MH0gKHsxfSkKLQotIyBVc2VkIGZvciBkaXNwbGF5aW5nIHRpbWUgKHNvIGZhciBvbmx5IHVzZWQgaW4gdG9vbHRpcCkKLW1pbnV0ZXM9ezB9IG1pbnV0ZXMgCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLQotCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VUaXRsZT1PdmVydmlldwotc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsU2VjdGlvbj1HZW5lcmFsIEluZm9ybWF0aW9uCi1zZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxEZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBob3N0IG5hbWUgYW5kIG90aGVyIGNvbW1vbiBzZXR0aW5ncy4KLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZT1TZXJ2ZXIgbmFtZToKLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZUNvbW1hbmQ9c2V0IHNlcnZlciBuYW1lCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoPUNvbmZpZ3VyYXRpb24gcGF0aDoKLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZT1Ccm93c2UuLi4KLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZU1lc3NhZ2U9U3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZT1Ib3N0IG5hbWU6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZD1zZXQgaG9zdCBuYW1lCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWU9UnVudGltZSBFbnZpcm9ubWVudDoKLXNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUVkaXQ9RWRpdAotc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lQ29tbWFuZD1zZXQgcnVudGltZSBlbnZpcm9ubWVudAotCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hTZWN0aW9uPVB1Ymxpc2hpbmcKLXNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaERlc2NyaXB0aW9uPU1vZGlmeSBzZXR0aW5ncyBmb3IgcHVibGlzaGluZy4KLXNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEaXNhYmxlPU5ldmVyIHB1Ymxpc2ggYXV0b21hdGljYWxseQotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWQ9QXV0b21hdGljYWxseSBwdWJsaXNoIHdoZW4gcmVzb3VyY2VzIGNoYW5nZQotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRJbnRlcnZhbD1QdWJsaXNoaW5nIGludGVydmFsIChpbiBzZWNvbmRzKToKLXNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQ9bW9kaWZ5IHB1Ymxpc2ggc2V0dGluZ3MKLXNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaGVycz1TZWxlY3QgZW5hYmxlZCBwdWJsaXNoZXJzOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0U2VjdGlvbj1UaW1lb3V0cwotc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0RGVzY3JpcHRpb249U3BlY2lmeSB0aGUgdGltZSBsaW1pdCB0byBjb21wbGV0ZSBzZXJ2ZXIgb3BlcmF0aW9ucy4KLXNlcnZlckVkaXRvck92ZXJ2aWV3U3RhcnRUaW1lb3V0PVN0YXJ0IChpbiBzZWNvbmRzKToKLXNlcnZlckVkaXRvck92ZXJ2aWV3U3RvcFRpbWVvdXQ9U3RvcCAoaW4gc2Vjb25kcyk6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kPW1vZGlmeSB0aW1lb3V0IHNldHRpbmdzCi1zZXJ2ZXJFZGl0b3JPdmVydmlld09wZW5MYXVuY2hDb25maWd1cmF0aW9uPU9wZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQotIyBNZW51IGl0ZW1zLiB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBvbmUgb2YgdGhlIHh4eEVkaXRvckFjdGlvblh4eCBmaWVsZHMKLSMgZnJvbSBiZWxvdy4gQEN0cmwrWiBpcyB0aGUgbWVudSBtbmVtb25pYwotZWRpdG9yVW5kb0VuYWJsZWQ9VW5kbyB7MH1AQ3RybCtaCi1lZGl0b3JVbmRvRGlzYWJsZWQ9VW5kb0BDdHJsK1oKLWVkaXRvclJlZG9FbmFibGVkPVJlZG8gezB9QEN0cmwrWQotZWRpdG9yUmVkb0Rpc2FibGVkPVJlZG9AQ3RybCtZCi0KLWVkaXRvclNhdmVFcnJvckRpYWxvZz1TYXZlIFByb2JsZW1zCi1lZGl0b3JTYXZlRXJyb3JNZXNzYWdlPUVycm9yIHdoaWxlIHNhdmluZy4gezB9Ci0KLWVkaXRvclJlYWRPbmx5PVJlYWQgT25seQotZWRpdG9yV3JpdGFibGU9V3JpdGFibGUKLWVkaXRvclJlYWRPbmx5RmlsZXM9UmVhZCBPbmx5IGZpbGVzOiB7MH0KLQotZWRpdG9yU2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKLWVkaXRvclByb21wdElycmV2ZXJzaWJsZT1UaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotZWRpdG9yUmVuYW1lRmlsZXM9VGhlIHNlcnZlciBoYXMgYmVlbiByZW5hbWVkLiBEbyB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgdG8gbWF0Y2g/Ci0KLSMgbWVzc2FnZSBpZiBhIGRpcnR5IHJlc291cmNlIGlzIGRlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlVGl0bGU9U2VydmVyIERlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZT1UaGUgc2VydmVyIHswfSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlPVNhdmUKLQotZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlPUZpbGUgQ2hhbmdlZAotZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlPVRoZSBzZXJ2ZXIgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIGVkaXRlZC4KLWVkaXRvclJlYWRPbmx5TWVzc2FnZT1GaWxlKHMpIGJlaW5nIGVkaXRlZCBoYXZlIGJlY29tZSByZWFkLW9ubHkuIFRoZSBlZGl0b3Igd2lsbCBiZWNvbWUgcmVhZC1vbmx5IGFuZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4KLQotZWRpdG9yUmVzb3VyY2VXYXJuVGl0bGU9U2VydmVyIE1vZGlmaWNhdGlvbiBXYXJuaW5nCi1lZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlPVRoZSBzZXJ2ZXIgeW91IGFyZSBtb2RpZnlpbmcgaXMgcmVhZC1vbmx5LiBBbGwgY2hhbmdlcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZC4KLQotCi1hdWRpb1ByZWZTZWxlY3RGaWxlPVNlbGVjdCBBdWRpbyBGaWxlCi1hdWRpb1ByZWZFbmFibGU9JkVuYWJsZSBzb3VuZHMKLWF1ZGlvUHJlZlZvbHVtZT0mVm9sdW1lOgotYXVkaW9QcmVmU291bmRzPSZTb3VuZHM6Ci1hdWRpb1ByZWZTb3VuZD1Tb3VuZAotYXVkaW9QcmVmRmlsZT1BdWRpbyBGaWxlCi1hdWRpb1ByZWZQbGF5PSZQbGF5Ci1hdWRpb1ByZWZCcm93c2U9JkJyb3dzZS4uLgotYXVkaW9QcmVmUmVzZXQ9JlJlc2V0Ci0KLWF1ZGlvVW5rbm93bj0odW5rbm93bikKLWF1ZGlvRGVmYXVsdD0oZGVmYXVsdCkKLWF1ZGlvTm9uZT0obm9uZSkKLQotZXJyb3JTdGFydGluZ01vbml0b3I9Q291bGQgbm90IHN0YXJ0IHRoZSBzZXJ2ZXIgbW9uaXRvcjogezB9Ci0KLWludGVybmFsV2ViQnJvd3Nlck5hbWU9SW50ZXJuYWwgV2ViIEJyb3dzZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Nb2R1bGVMYWJlbERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjEyZDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVMYWJlbERlY29yYXRvciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yIHsKLQlwdWJsaWMgTW9kdWxlTGFiZWxEZWNvcmF0b3IoKSB7Ci0JCXN1cGVyKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9ICgoTW9kdWxlU2VydmVyKSBlbGVtZW50KS5tb2R1bGU7Ci0JCQkJbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOwotCQkJfQotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIHByb2plY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9ICgoTW9kdWxlU2VydmVyKSBlbGVtZW50KS5tb2R1bGU7Ci0JCQkJbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOwotCQkJfQotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJaWYgKCFwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGV4dCkpCi0JCQkJdGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLm1vZHVsZURlY29yYXRvclByb2plY3QsIG5ldyBTdHJpbmdbXSB7dGV4dCwgcHJvamVjdC5nZXROYW1lKCl9KTsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5kZWNvcmF0ZVRleHQodGV4dCwgcHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Nb2R1bGVMYWJlbERlY29yYXRvcjIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMxZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVMYWJlbERlY29yYXRvcjIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQlwdWJsaWMgTW9kdWxlTGFiZWxEZWNvcmF0b3IyKCkgewotCQlzdXBlcihmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJdHJ5IHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJZGVjb3JhdGlvbi5hZGRTdWZmaXgoIiAqIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQltb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQpLm1vZHVsZTsKLQkJCQltb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQl9Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlTdHJpbmcgdGV4dCA9IG1vZHVsZS5nZXROYW1lKCk7Ci0JCQkKLQkJCWlmICghcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRleHQpKQotCQkJCWRlY29yYXRpb24uYWRkU3VmZml4KCIgKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7Ci0JCQkJLy90ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubW9kdWxlRGVjb3JhdG9yUHJvamVjdCwgbmV3IFN0cmluZ1tdIHt0ZXh0LCBwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJLy9yZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZGVjb3JhdGVUZXh0KHRleHQsIHByb2plY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL092ZXJsYXlJbWFnZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL092ZXJsYXlJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyNjVlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIEEgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgb25lIG9yIG1vcmUgb3ZlcmxheXMuCi0gKiBUaGUgb3ZlcmxheXMgYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQkvLyBmbGFnIHRvIHJlbmRlciB0aGUgZXJyb3Igb3ZlcmxheQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SID0gMHgwMDE7Ci0KLQlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZkZsYWdzOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhZG9ybm1lbnRzIGFyZSB0byBiZSByZW5kZXJlZAotCSAqLwotCXB1YmxpYyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgaW50IGZsYWdzKSB7Ci0JCXNldEJhc2VJbWFnZShiYXNlSW1hZ2UpOwotCQlzZXRGbGFncyhmbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCWlmIChmU2l6ZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURhdGEgZGF0YSA9IGdldEJhc2VJbWFnZSgpLmdldEltYWdlRGF0YSgpOwotCQkJc2V0U2l6ZShuZXcgUG9pbnQoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpKTsKLQkJfQotCQlyZXR1cm4gZlNpemU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE92ZXJsYXlJbWFnZURlc2NyaXB0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCU92ZXJsYXlJbWFnZURlc2NyaXB0b3Igb3RoZXIgPSAoT3ZlcmxheUltYWdlRGVzY3JpcHRvcikgb2JqZWN0OwotCQlyZXR1cm4gKGdldEJhc2VJbWFnZSgpLmVxdWFscyhvdGhlci5nZXRCYXNlSW1hZ2UoKSkgJiYgZ2V0RmxhZ3MoKSA9PSBvdGhlci5nZXRGbGFncygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRCYXNlSW1hZ2UoKS5oYXNoQ29kZSgpIHwgZ2V0RmxhZ3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7Ci0JCWludCBmbGFncyA9IGdldEZsYWdzKCk7Ci0JCUltYWdlRGF0YSBkYXRhID0gbnVsbDsKLQkJaWYgKChmbGFncyAmIEVSUk9SKSAhPSAwKSB7Ci0JCQlkYXRhID0gRGVidWdVSVRvb2xzLmdldEltYWdlKElEZWJ1Z1VJQ29uc3RhbnRzLklNR19PVlJfRVJST1IpLmdldEltYWdlRGF0YSgpOwotCQkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7Ci0JCQlkcmF3SW1hZ2UoZGF0YSwgeCwgMCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgewotCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RmxhZ3MoKSB7Ci0JCXJldHVybiBmRmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCWZGbGFncyA9IGZsYWdzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCQlmU2l6ZSA9IHNpemU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTNlOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUHJvZ3Jlc3MgTW9uaXRvciB1dGlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NVdGlsIHsKLQkvKioKLQkgKiBQcm9ncmVzc1V0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFByb2dyZXNzVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2YWxpZCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldE1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGludAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbAotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNWIzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0vKioKLSAqIFByb3BlcnR5UGFnZSBmb3IgSVByb2plY3RzLiBJdCBzaG93cyB0aGUgc2VydmVyIHByZWZlcmVuY2UgZm9yIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgaW50IGNvdW50OwotCXByb3RlY3RlZCBJU2VydmVyIGRlZmF1bHRTZXJ2ZXI7Ci0KLQkvKioKLQkgKiBQcm9qZWN0UHJvcGVydHlQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb2plY3RQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBwYWdlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50LmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJLy9pZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJLy8JcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJCQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQotCQkJLypMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3REZXNjcmlwdGlvbik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsqLwotCQkJCi0JCQltb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkgewotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3ROb3RNb2R1bGUpOwotCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJfSBlbHNlIHsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3QpOwotCQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQkKLQkJCQkJTGFiZWwgbW9kdWxlS2luZCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCQkJbW9kdWxlS2luZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQltb2R1bGVLaW5kLnNldFRleHQobW9kdWxlLmdldE5hbWUoKSArICIgKCIgKyBtdC5nZXROYW1lKCkgKyAiKSIpOwotCQkJCX0KLQkJCQkKLQkJCQlkZWZhdWx0U2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCQkJCi0JCQkJZmluYWwgSVNlcnZlcltdIHNlcnZlcnMgPSBnZXRTZXJ2ZXJzQnlTdXBwb3J0ZWRNb2R1bGUobW9kdWxlKTsKLQkJCQlpZiAoc2VydmVycyA9PSBudWxsIHx8IHNlcnZlcnMubGVuZ3RoID09IDApIHsKLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3ROb3RDb25maWd1cmVkKTsKLQkJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3REZWZhdWx0U2VydmVyKTsKLQkJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQotCQkJCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMKTsKLQkJCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCQkJCWRhdGEuaGVpZ2h0SGludCA9IDkwOwotCQkJCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQkKLQkJCQkJLy8gYWRkIG5vbmUgb3B0aW9uCi0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3ROb1NlcnZlcik7Ci0JCQkJCS8vaXRlbS5zZXRJbWFnZSgpOwotCQkJCQkKLQkJCQkJaW50IHNpemUyID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJCWNvdW50ID0gMDsKLQkJCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChsYWJlbFByb3ZpZGVyLmdldFRleHQoc2VydmVyc1tqXSkpOwotCQkJCQkJaXRlbS5zZXRJbWFnZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlcnZlcnNbal0pKTsKLQkJCQkJCWl0ZW0uc2V0RGF0YShzZXJ2ZXJzW2pdKTsKLQkJCQkJCWlmIChzZXJ2ZXJzW2pdLmVxdWFscyhkZWZhdWx0U2VydmVyKSkKLQkJCQkJCQljb3VudCA9IGogKyAxOwotCQkJCQl9Ci0JCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCQkKLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uKGNvdW50KTsKLQkJCQkJCi0JCQkJCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJCWlmIChpbmRleCA9PSAwKQotCQkJCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCQkJCWVsc2UgaWYgKGluZGV4ID4gMCkKLQkJCQkJCQkJc2VydmVyID0gc2VydmVyc1tpbmRleC0xXTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBwcm9qZWN0IHByb3BlcnR5IHBhZ2UiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHNlcnZlcnMgdGhhdCB0aGlzIG1vZHVsZSBpcyBjb25maWd1cmVkIG9uLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2VydmVycwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlcltdIGdldFNlcnZlcnNCeVN1cHBvcnRlZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTZXJ2ZXJbMF07Ci0JCQotCQkvLyBkbyBpdCB0aGUgc2xvdyB3YXkgLSBnbyB0aHJvdWdoIGFsbCBzZXJ2ZXJzIGFuZAotCQkvLyBzZWUgaWYgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBpbiBpdAotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmCi0JCQkJCXNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJgotCQkJCQlTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJU2VydmVyW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJdGFibGUuc2VsZWN0KGNvdW50KTsKLQkJCXNlcnZlciA9IGRlZmF1bHRTZXJ2ZXI7Ci0JCX0KLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVNlcnZlckNvcmUuc2V0RGVmYXVsdFNlcnZlcihtb2R1bGUsIHNlcnZlciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzZXR0aW5nIHByZWZlcnJlZCBzZXJ2ZXIiLCBlKTsKLQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlLCBlLmdldFN0YXR1cygpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTWFya2VyUmVzb2x1dGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZU1hcmtlclJlc29sdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyNTJhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTWFya2VyUmVzb2x1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbjIgewotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBNZXNzYWdlcy53aXpOZXdSdW50aW1lRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJSdW50aW1lQ3JlYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQlzaG93UHJlZmVyZW5jZVBhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIjsKLQkJU3RyaW5nIGlkMiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnJ1bnRpbWUucHJlZmVyZW5jZVBhZ2UiOwotCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24obnVsbCwgaWQyLCBuZXcgU3RyaW5nW10geyBpZCwgaWQyIH0sIG51bGwpOwotCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwMjBlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JUnVudGltZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuUnVudGltZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogVGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIHNlcnZlciBydW50aW1lcy4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIExhYmVsIHBhdGhMYWJlbDsKLQotCS8qKgotCSAqIFJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByZWZlcmVuY2Ugb3B0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzRGVzY3JpcHRpb24pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZlcmVuY2VSdW50aW1lc1RhYmxlKTsKLQkJCi0JCWZpbmFsIFJ1bnRpbWVDb21wb3NpdGUgcnVudGltZUNvbXAgPSBuZXcgUnVudGltZUNvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FLCBuZXcgUnVudGltZUNvbXBvc2l0ZS5SdW50aW1lU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW50aW1lU2VsZWN0ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlwYXRoTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJQ29sb3IgYyA9IHBhdGhMYWJlbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0Rm9yZWdyb3VuZChjKTsKLQkJCQkJCXBhdGhMYWJlbC5zZXRUZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0Rm9yZWdyb3VuZChlZGl0LmdldEZvcmVncm91bmQoKSk7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0VGV4dChydW50aW1lLmdldExvY2F0aW9uKCkgKyAiIik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcGF0aExhYmVsLnNldFRleHQoIiIpOwotCQkJCQkKLQkJCQkJaWYgKHJ1bnRpbWUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsKQotCQkJCQkJCWVkaXQuc2V0RW5hYmxlZChTZXJ2ZXJVSVBsdWdpbi5oYXNXaXphcmRGcmFnbWVudChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJ1bnRpbWVDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmFkZCk7Ci0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoc2hvd1dpemFyZChudWxsKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0JCQkJcnVudGltZUNvbXAucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKLQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gcnVudGltZUNvbXAuZ2V0U2VsZWN0ZWRSdW50aW1lKCk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkJaWYgKHNob3dXaXphcmQocnVudGltZVdvcmtpbmdDb3B5KSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJ1bnRpbWVDb21wLnJlZnJlc2gocnVudGltZSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmUgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5yZW1vdmUpOwotCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gcnVudGltZUNvbXAuZ2V0U2VsZWN0ZWRSdW50aW1lKCk7Ci0JCQkJaWYgKHJlbW92ZVJ1bnRpbWUocnVudGltZSkpCi0JCQkJCXJ1bnRpbWVDb21wLnJlbW92ZShydW50aW1lKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gc2VhcmNoID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuc2VhcmNoKTsKLQkJZGF0YSA9IChHcmlkRGF0YSkgc2VhcmNoLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDk7Ci0JCXNlYXJjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBzZWxlY3QgYSB0YXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgc2VhcmNoCi0JCQkJCURpcmVjdG9yeURpYWxvZyBkaXJlY3RvcnlEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQlkaXJlY3RvcnlEaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5kaWFsb2dSdW50aW1lU2VhcmNoTWVzc2FnZSk7Ci0JCQkJCWRpcmVjdG9yeURpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVTZWFyY2hUaXRsZSk7Ci0KLQkJCQkJU3RyaW5nIHBhdGhTdHIgPSBkaXJlY3RvcnlEaWFsb2cub3BlbigpOwotCQkJCQlpZiAocGF0aFN0ciA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJZmluYWwgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHIpOwotCQkJCQkKLQkJCQkJZmluYWwgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCWRpYWxvZy5zZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0JCQkJCWRpYWxvZy5zZXRDYW5jZWxhYmxlKHRydWUpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBkaWFsb2cuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJCWZpbmFsIElSdW50aW1lTG9jYXRvcltdIGxvY2F0b3JzID0gU2VydmVyUGx1Z2luLmdldFJ1bnRpbWVMb2NhdG9ycygpOwotCQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5kaWFsb2dSdW50aW1lU2VhcmNoUHJvZ3Jlc3MsIDEwMCAqIGxvY2F0b3JzLmxlbmd0aCArIDEwKTsKLQkJCQkJZmluYWwgTGlzdDxJUnVudGltZVdvcmtpbmdDb3B5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZVdvcmtpbmdDb3B5PigpOwotCQkJCQkKLQkJCQkJZmluYWwgSVJ1bnRpbWVMb2NhdG9yLklSdW50aW1lU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVJ1bnRpbWVMb2NhdG9yLklSdW50aW1lU2VhcmNoTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW50aW1lRm91bmQoZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lKSB7Ci0JCQkJCQkJZGlhbG9nLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJbW9uaXRvci5zdWJUYXNrKHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJCWxpc3QuYWRkKHJ1bnRpbWUpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQkKLQkJCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCQkJaW50IHNpemUgPSBsb2NhdG9ycy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJaWYgKCFtb25pdG9yMi5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWxvY2F0b3JzW2ldLnNlYXJjaEZvclJ1bnRpbWVzKHBhdGgsIGxpc3RlbmVyLCBtb25pdG9yMik7Ci0JCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGxvY2F0aW5nIHJ1bnRpbWVzOiAiICsgbG9jYXRvcnNbaV0uZ2V0SWQoKSwgY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiRG9uZSBzZWFyY2giKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJZGlhbG9nLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQkJCQotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkZvdW5kIHJ1bnRpbWVzOiAiICsgbGlzdC5zaXplKCkpOwotCQkJCQkKLQkJCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmluZm9Ob1J1bnRpbWVzRm91bmQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDUpOwotCQkJCQkJLy8gcmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBsaXN0IChiYXNlZCBvbiBsb2NhdGlvbikKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiUmVtb3ZpbmcgZHVwbGljYXRlcyIpOwotCQkJCQkJTGlzdDxJUnVudGltZT4gZ29vZCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvcjIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJCQkJCWJvb2xlYW4gZHVwID0gZmFsc2U7Ci0JCQkJCQkJSVJ1bnRpbWUgd2MgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJCQkJCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgcnVudGltZXNbaV0uZ2V0TG9jYXRpb24oKS5lcXVhbHMod2MuZ2V0TG9jYXRpb24oKSkpCi0JCQkJCQkJCQkJZHVwID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cCkKLQkJCQkJCQkJZ29vZC5hZGQod2MpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCB0byBsaXN0Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkFkZGluZyBydW50aW1lczogIiArIGdvb2Quc2l6ZSgpKTsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ29vZC5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCXdjLnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmRpbmcgcnVudGltZXMiLCBleCk7Ci0JCQkJfQotCQkJCXJ1bnRpbWVDb21wLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlwYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgZm9yIHVzZQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lLmVxdWFscyhzZXJ2ZXJzW2ldLmdldFJ1bnRpbWUoKSkpCi0JCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIGluVXNlID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpblVzZSA9IEZhY2V0VXRpbC5pc1J1bnRpbWVUYXJnZXRlZChydW50aW1lKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vIGlnbm9yZSAtIGZhY2V0IGZyYW1ld29yayBub3QgZm91bmQKLQkJfQotCQkKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSB8fCBpblVzZSkgewotCQkJRGVsZXRlUnVudGltZURpYWxvZyBkaWFsb2cgPSBuZXcgRGVsZXRlUnVudGltZURpYWxvZyhnZXRTaGVsbCgpLCAhbGlzdC5pc0VtcHR5KCksIGluVXNlKTsKLQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAoZGlhbG9nLmlzRGVsZXRlU2VydmVycygpKSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJc2VydmVyLmRlbGV0ZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZGVsZXRpbmcgc2VydmVyIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLmlzUmVtb3ZlVGFyZ2V0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmFjZXRVdGlsLnJlbW92ZVRhcmdldHMocnVudGltZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJLy8gaWdub3JlIC0gZmFjZXQgZnJhbWV3b3JrIG5vdCBmb3VuZAotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJ1bnRpbWUuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBkZWxldGluZyBydW50aW1lIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2hvd1dpemFyZChmaW5hbCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSkgewotCQlTdHJpbmcgdGl0bGUgPSBudWxsOwotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG51bGw7Ci0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCWlmIChydW50aW1lV29ya2luZ0NvcHkgPT0gbnVsbCkgewotCQkJdGl0bGUgPSBNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQkJCWxpc3QuYWRkKG5ldyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQl0aXRsZSA9IE1lc3NhZ2VzLndpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCQlmaW5hbCBXaXphcmRGcmFnbWVudCBmcmFnbWVudDIgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudChydW50aW1lV29ya2luZ0NvcHkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCWlmIChmcmFnbWVudDIgPT0gbnVsbCkgewotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuIFdpbmRvdy5DQU5DRUw7Ci0JCQl9Ci0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWVXb3JraW5nQ29weSk7Ci0JCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQkJCWxpc3QuYWRkKGZyYWdtZW50Mik7Ci0JCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZCh0aXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCBJUnVudGltZSBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJcmV0dXJuIChJUnVudGltZSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeyAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKQotCQkJc2V0VGl0bGUoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGVMb25nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzc0OWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotLyoqCi0gKiBTV1QgVXRpbGl0eSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCXByaXZhdGUgc3RhdGljIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEaWFsb2dVbml0cyhDb250cm9sIHRlc3RDb250cm9sKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB3aWR0aCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEJ1dHRvbldpZHRoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWludCB3aWR0aEhpbnQgPSBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBzdGFuZGFyZCBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBjb21wIHRoZSBjb21wb25lbnQgdG8gYWRkIHRoZSBidXR0b24gdG8KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gYSBidXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQliLnNldFRleHQobGFiZWwpOwotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLndpZHRoSGludCA9IGdldEJ1dHRvbldpZHRoSGludChiKTsKLQkJYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCBhIGNvbXBvbmVudAotCSAqIEBwYXJhbSB4IHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeCkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCBhIGNvbXBvbmVudAotCSAqIEBwYXJhbSB5IHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhDb21wb3NpdGUgY29tcCwgaW50IHkpIHsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCB5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRvb2x0aXAgb2YgYSBzcGlubmVyIHRoYXQgcmVwcmVzZW50cyBhIHRpbWUgaW4gc2Vjb25kcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3Bpbm5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTcGlubmVyVG9vbHRpcChTcGlubmVyIHNwaW5uZXIpIHsJCQotCQlpbnQgc2Vjb25kcyA9IHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCVN0cmluZyB0b29sdGlwVGV4dDsKLQkJaWYgKHNlY29uZHMgPD0gNjApCi0JCQl0b29sdGlwVGV4dCA9IG51bGw7Ci0JCWVsc2UgaWYgKChzZWNvbmRzICUgNjApID09IDApIHsgLy8gdGhlIHNlY29uZHMgYXJlIGV4YWN0IG1pbnV0ZXMKLQkJCWludCBtaW51dGVzID0gc2Vjb25kcyAvIDYwOwotCQkJdG9vbHRpcFRleHQgPSBOTFMuYmluZChNZXNzYWdlcy5taW51dGVzLCBtaW51dGVzICsgIiIpOwotCQl9IGVsc2UgewotCQkJaW50IG1pbnV0ZXMgPSBzZWNvbmRzIC8gNjA7Ci0JCQlpbnQgbW9kU2VjID0gKHNlY29uZHMgJSA2MCk7Ci0JCQlTdHJpbmcgc2Vjb25kc1RleHQgPSAobW9kU2VjIDwgMTApID8gIjAiICsgbW9kU2VjIDogSW50ZWdlci50b1N0cmluZyhtb2RTZWMpOyAKLQkJCXRvb2x0aXBUZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubWludXRlcywgbWludXRlcyArICI6IiArIHNlY29uZHNUZXh0KTsKLQkJfQotCQlzcGlubmVyLnNldFRvb2xUaXBUZXh0KHRvb2x0aXBUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjYxNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLS8qKgotICogQWRhcHRlciBmYWN0b3J5IHRvIGFkYXB0IHNlcnZlcnMgdG8gSUFjdGlvbkZpbHRlci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQlJQWN0aW9uRmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJQWN0aW9uRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJCXJldHVybiBTZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5jaGVja1Byb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpOwotCQl9Ci0JfTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzKQotCQkJcmV0dXJuIGFjdGlvbkZpbHRlcjsKLQkJCi0JCWlmIChhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKLQkJCXJldHVybiBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkNzQxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotLyoqCi0gKiBBIGxhYmVsIHByb3ZpZGVyIGZvciBhbGwgc2VydmVyIHJlbGF0ZWQgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciwgSUNvbG9yUHJvdmlkZXIsIElXb3JrYmVuY2hBZGFwdGVyIHsKLQlwcml2YXRlIElMYWJlbERlY29yYXRvciBkZWNvcmF0b3I7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVyczsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBwcm92aWRlckxpc3RlbmVyOwotCi0JcHVibGljIFNlcnZlckxhYmVsUHJvdmlkZXIoKSB7Ci0JCWRlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCXByb3ZpZGVyTGlzdGVuZXIgPSBuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlmaXJlTGlzdGVuZXIoZXZlbnQpOwotCQkJfQotCQl9OwotCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+KCk7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQkKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUxpc3RlbmVyKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGxpc3RlbmVycy5zaXplKCk7Ci0JCUlMYWJlbFByb3ZpZGVyTGlzdGVuZXJbXSBzcmwgPSBuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcltzaXplXTsKLQkJbGlzdGVuZXJzLnRvQXJyYXkoc3JsKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXNybFtpXS5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICIgIEVycm9yIGZpcmluZyBsYWJlbCBjaGFuZ2UgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TW9kdWxlSW1hZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbWFnZSBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKLQkJaW50IGluZCA9IHR5cGVJZC5pbmRleE9mKCIuIik7Ci0JCXdoaWxlIChpbWFnZSA9PSBudWxsICYmIGluZCA+PSAwKSB7Ci0JCQl0eXBlSWQgPSB0eXBlSWQuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRNb2R1bGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHR5cGVJZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHR5cGVJZCk7Ci0JCWludCBpbmQgPSB0eXBlSWQuaW5kZXhPZigiLiIpOwotCQl3aGlsZSAoaW1hZ2UgPT0gbnVsbCAmJiBpbmQgPj0gMCkgewotCQkJdHlwZUlkID0gdHlwZUlkLnN1YnN0cmluZygwLCBpbmQpOwotCQkJaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewotCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoSVNlcnZlclR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3Ioc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2VEZXNjcmlwdG9yKG10LmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2VEZXNjcmlwdG9yKG10LmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gKChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBpbWFnZSBkZXNjcmlwdG9yIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBkZWNvcmF0ZShJbWFnZSBpbWFnZSwgT2JqZWN0IG9iaikgewotCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgb2JqKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcmV0dXJuIGRlYzsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlY29yYXRlKFN0cmluZyB0ZXh0LCBPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIG9iaik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXJldHVybiBkZWM7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGRlY29yYXRlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSksIHJ1bnRpbWVUeXBlKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZGVjb3JhdGUoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSksIHJ1bnRpbWUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBkZWNvcmF0ZShJbWFnZVJlc291cmNlLmdldEltYWdlKHNlcnZlclR5cGUuZ2V0SWQoKSksIHNlcnZlclR5cGUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKSwgc2VydmVyKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtb2R1bGUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtb2R1bGVzKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtcyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IGltYWdlIGRlc2NyaXB0b3IiLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQkKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJCXJldHVybiBkZWNvcmF0ZShnZXRTdHJpbmcoKHJ1bnRpbWUpLmdldE5hbWUoKSksIHJ1bnRpbWUpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQkJcmV0dXJuIGRlY29yYXRlKGdldFN0cmluZygoc2VydmVyKS5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKLQkJCUlSdW50aW1lVHlwZSBydCA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGVjb3JhdGUocnQuZ2V0TmFtZSgpLCBydCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7Ci0JCQlJU2VydmVyVHlwZSBzdCA9IChJU2VydmVyVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiBkZWNvcmF0ZShzdC5nZXROYW1lKCksIHN0KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNsaWVudCkgewotCQkJSUNsaWVudCBjbGllbnQgPSAoSUNsaWVudCkgZWxlbWVudDsKLQkJCXJldHVybiBkZWNvcmF0ZShjbGllbnQuZ2V0TmFtZSgpLCBjbGllbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwotCQkJcmV0dXJuIGRlY29yYXRlKG1vZHVsZS5nZXROYW1lKCksIG1vZHVsZSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGVbXSkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQlyZXR1cm4gZGVjb3JhdGUobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCUlNb2R1bGUgbW9kdWxlID0gbXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXTsKLQkJCXJldHVybiBkZWNvcmF0ZShtb2R1bGUuZ2V0TmFtZSgpLCBtcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gKChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudCkuZ2V0TGFiZWwobnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcillbGVtZW50OwotCQkJCi0JCQlJTW9kdWxlIG1vZHVsZSA9IG1zLm1vZHVsZVswXTsKLQkJCWlmIChtb2R1bGUuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJQ29sb3IgYyA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQkJCQlyZXR1cm4gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGdldFRleHQobyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYXVuY2hTaG9ydGN1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA1MDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTGF1bmNoU2hvcnRjdXQgaW1wbGVtZW50cyBJTGF1bmNoU2hvcnRjdXQyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGF1bmNoU2hvcnRjdXQjbGF1bmNoKElTZWxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZyBtb2RlKSB7Ci0JCVJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgcm9zID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKTsKLQkJcm9zLnNldExhdW5jaE1vZGUobW9kZSk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCS8vIGR1bW15IGFjdGlvbgotCQl9OwotCQlyb3Muc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCXJvcy5ydW4oYWN0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGF1bmNoU2hvcnRjdXQjbGF1bmNoKElFZGl0b3JQYXJ0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElFZGl0b3JQYXJ0IGVkaXRvciwgU3RyaW5nIG1vZGUpIHsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgotCQkvLyB0aGUgZWRpdG9yIGhhcyBhIGZpbGUgaW5wdXQgdGhhdCBjYW4gYmUgcnVuCi0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkKLQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChpbnB1dCkpIHsKLQkJCWxhdW5jaChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbnB1dCksIG1vZGUpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZmlsZSkpCi0JCQkJbGF1bmNoKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpLCBtb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+SVNlbGVjdGlvbjwvY29kZT4gdGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiAKLQkgKiA8Y29kZT5JTGF1bmNoQ29uZmlndXJhdGlvbjwvY29kZT5zIHRoYXQgYXBwbHkgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCAKLQkgKiBpLmUuIGFsbCBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIHRoYXQgY291bGQgYmUgdXNlZCB0byBsYXVuY2ggdGhlIGdpdmVuIAotCSAqIHNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+SUxhdW5jaENvbmZpZ3VyYXRpb248L2NvZGU+cyB0aGF0IGNvdWxkIGJlIAotCSAqIHVzZWQgdG8gbGF1bmNoIHRoZSBnaXZlbiBzZWxlY3Rpb24sIG9yIGFuIGVtcHR5IGFycmF5LCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbltdIGdldExhdW5jaENvbmZpZ3VyYXRpb25zKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25bMF07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhdW5jaFNob3J0Y3V0MiNnZXRMYXVuY2hDb25maWd1cmF0aW9ucyhJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBnZXRMYXVuY2hDb25maWd1cmF0aW9ucyhJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblswXTsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgaW5wdXQgaXRzZWxmIGNhbiBiZSBydW4uIE90aGVyd2lzZSwgY2hlY2sgaWYKLQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCi0JCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoaW5wdXQpKSB7Ci0JCQlyZXR1cm4gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJSUZpbGUgZmlsZSA9IGZlaS5nZXRGaWxlKCk7Ci0JCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGZpbGUpKQotCQkJCXJldHVybiBnZXRMYXVuY2hDb25maWd1cmF0aW9ucyhuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWxlKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblswXTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIDxjb2RlPklTZWxlY3Rpb248L2NvZGU+IHRoaXMgbWV0aG9kIHJldHVybnMgYW4KLQkgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHRoYXQgZGlyZWN0bHkgbWFwcyB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICogVGhpcyBtYXBwaW5nIGlzIHRoZW4gbGV2ZXJhZ2VkIGJ5IHRoZSBjb250ZXh0IGxhdW5jaGluZyBmcmFtZXdvcmsKLQkgKiB0byB0cnkgYW5kIGxhdW5jaCB0aGUgcmVzb3VyY2UuIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHJldHVybiBhbiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHRoYXQgd291bGQgYmUgdXNlZCBkdXJpbmcgY29udGV4dAotCSAqIHNlbnNpdGl2ZSBsYXVuY2hpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgb25lIGlzIG5vdCB0byBiZSBwcm92aWRlZCBvciBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldExhdW5jaGFibGVSZXNvdXJjZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGF1bmNoU2hvcnRjdXQyI2dldExhdW5jaGFibGVSZXNvdXJjZShJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldExhdW5jaGFibGVSZXNvdXJjZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBjaGVjayBpZiB0aGUgZWRpdG9yIGlucHV0IGl0c2VsZiBjYW4gYmUgcnVuLiBPdGhlcndpc2UsIGNoZWNrIGlmCi0JCS8vIHRoZSBlZGl0b3IgaGFzIGEgZmlsZSBpbnB1dCB0aGF0IGNhbiBiZSBydW4KLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQotCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KSkgewotCQkJcmV0dXJuIGdldExhdW5jaGFibGVSZXNvdXJjZShuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbnB1dCkpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZmlsZSkpCi0JCQkJcmV0dXJuIGdldExhdW5jaGFibGVSZXNvdXJjZShuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWxlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIzMzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBzZXJ2ZXIgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBTZXJ2ZXJQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQlwcm90ZWN0ZWQgU2VydmVyVUlQcmVmZXJlbmNlcyB1aVByZWZlcmVuY2VzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzaG93T25BY3Rpdml0eTsKLQotCS8qKgotCSAqIFNlcnZlclByZWZlcmVuY2VzUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpOwotCQl1aVByZWZlcmVuY2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJc2hvd09uQWN0aXZpdHkgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJc2hvd09uQWN0aXZpdHkuc2V0VGV4dChNZXNzYWdlcy5wcmVmU2hvd09uQWN0aXZpdHkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzaG93T25BY3Rpdml0eS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzaG93T25BY3Rpdml0eS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXRTaG93T25BY3Rpdml0eSgpKTsKLQkJd2hzLnNldEhlbHAoc2hvd09uQWN0aXZpdHksIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1NIT1dfT05fQUNUSVZJVFkpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzaG93T25BY3Rpdml0eS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0U2hvd09uQWN0aXZpdHkoKSk7Ci0JCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl1aVByZWZlcmVuY2VzLnNldFNob3dPbkFjdGl2aXR5KHNob3dPbkFjdGl2aXR5LmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTliZmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiBQcm9wZXJ0eVBhZ2UgZm9yIHNlcnZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXByb3RlY3RlZCBJU2VydmVyIGRlZmF1bHRTZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJQcm9wZXJ0eVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYm9keSBvZiB0aGUgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCQkJSUFkYXB0YWJsZSBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkJc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQuZ2V0QWRhcHRlcihJU2VydmVyLmNsYXNzKTsKLQkJCQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQkKLQkJCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlNFUlZFUl9QUk9QRVJUWV9QQUdFKTsJCQkKLQkJCQotCQkJLy8gbmFtZQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByb3BTZXJ2ZXJJbmZvTmFtZSk7Ci0JCQkKLQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJLy8gdHlwZQotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByb3BTZXJ2ZXJJbmZvVHlwZSk7Ci0JCQkKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsKQotCQkJCWxhYmVsLnNldFRleHQoc2VydmVyVHlwZS5nZXROYW1lKCkpOwotCQkJZWxzZQotCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJLy8gdmVuZG9yCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJvcFNlcnZlckluZm9WZW5kb3IpOwotCQkJCi0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBudWxsOwotCQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkKLQkJCQlydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJbGFiZWwuc2V0VGV4dChydW50aW1lVHlwZS5nZXRWZW5kb3IoKSk7Ci0JCQllbHNlCi0JCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQkvLyBsb2NhdGlvbgotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnN3aXRjaFNlcnZlckxvY2F0aW9uKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQkJCi0JCQlmaW5hbCBMYWJlbCBzZXJ2ZXJMb2NhdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWZpbmFsIFNlcnZlciBzdnIgPSAoU2VydmVyKSBzZXJ2ZXI7Ci0JCQlpZiAoc3ZyLmdldEZpbGUoKSAhPSBudWxsKQotCQkJCXNlcnZlckxvY2F0aW9uLnNldFRleHQoc3ZyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChNZXNzYWdlcy5zd2l0Y2hTZXJ2ZXJMb2NhdGlvbk1ldGFkYXRhKTsKLQkJCQotCQkJc2VydmVyTG9jYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkKLQkJCUJ1dHRvbiBzd2l0Y2hMb2NhdGlvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlzd2l0Y2hMb2NhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN3aXRjaFNlcnZlckxvY2F0aW9uKTsKLQkJCXN3aXRjaExvY2F0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCQlzd2l0Y2hMb2NhdGlvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTZXJ2ZXIuc3dpdGNoTG9jYXRpb24oc3ZyLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3dpdGNoaW5nIHNlcnZlciBsb2NhdGlvbiIsIGNlKTsKLQkJCQkJfQotCQkJCQlpZiAoc3ZyLmdldEZpbGUoKSAhPSBudWxsKQotCQkJCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChzdnIuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJZWxzZQotCQkJCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChNZXNzYWdlcy5zd2l0Y2hTZXJ2ZXJMb2NhdGlvbk1ldGFkYXRhKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgcHJvcGVydHkgcGFnZSIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4NTNkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIGNoZWNrUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCAoU3RyaW5nKSBleHBlY3RlZFZhbHVlKTsKLQkJaWYgKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgZXhwZWN0ZWRWYWx1ZS50b1N0cmluZygpKTsKLQkJCi0JCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNoZWNrUHJvcGVydHkoT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCJpc1J1bm5hYmxlIi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQkvLyBjaGVjayBpZiBwcm9qZWN0IGhhcyBhIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlNb2R1bGUgbSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKChJUHJvamVjdCkgdGFyZ2V0KTsKLQkJCQlpZiAobSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBydW5uYWJsZSBvYmplY3QKLQkJCWJvb2xlYW4gYiA9IFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdCh0YXJnZXQpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCS8qaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQkvLwkgY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgotCQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKElFZGl0b3JQYXJ0KSByZWNlaXZlcjsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCi0JCQliID0gU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KTsKLQkJCWlmIChiKQotCQkJCXJldHVybiB0cnVlOyovCi0JCQkKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgdGFyZ2V0OwotCQkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOwotCQkJCWIgPSBTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZmlsZSk7Ci0JCQkJaWYgKGIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCJzZXJ2ZXJUeXBlIi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCXNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHRhcmdldDsKLQkJCQlzZXJ2ZXIgPSBtcy5zZXJ2ZXI7Ci0JCQl9Ci0JCQlpZiAoc2VydmVyID09IG51bGwgfHwgc2VydmVyLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJU3RyaW5nW10gdHlwZUlkcyA9IFNlcnZlclBsdWdpbi50b2tlbml6ZSh2YWx1ZSwgIiwiKTsKLQkJCXJldHVybiBtYXRjaGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSwgdHlwZUlkcyk7Ci0JCX0gZWxzZSBpZiAoIm1vZHVsZVR5cGUiLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBudWxsOwotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElNb2R1bGVbXSkgewotCQkJCW1vZHVsZSA9IChJTW9kdWxlW10pIHRhcmdldDsKLQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCW1vZHVsZSA9IG5ldyBJTW9kdWxlW10geyhJTW9kdWxlKSB0YXJnZXR9OwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSB0YXJnZXQ7Ci0JCQkJbW9kdWxlID0gbXMubW9kdWxlOwotCQkJfQotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChtb2R1bGUubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBTZXJ2ZXJQbHVnaW4udG9rZW5pemUodmFsdWUsICIsIik7Ci0JCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJcmV0dXJuIG1hdGNoZXMobS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSwgdmFsdWVzKTsKLQkJfSBlbHNlIGlmICgibW9kdWxlVmVyc2lvbiIuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQkJbW9kdWxlID0gKElNb2R1bGVbXSkgdGFyZ2V0OwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJbW9kdWxlID0gbmV3IElNb2R1bGVbXSB7KElNb2R1bGUpIHRhcmdldH07Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHRhcmdldDsKLQkJCQltb2R1bGUgPSBtcy5tb2R1bGU7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IFNlcnZlclBsdWdpbi50b2tlbml6ZSh2YWx1ZSwgIiwiKTsKLQkJCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQlyZXR1cm4gbWF0Y2hlcyhtLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCksIHZhbHVlcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgKGdpdmVuIGJ5IHRoZSBpZCkgY2FuIHVzZSB0aGlzIGFjdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpZCwgU3RyaW5nW10gdHlwZUlkcykgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0eXBlSWRzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHR5cGVJZHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHR5cGVJZHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSB0eXBlSWRzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgodHlwZUlkc1tpXS5zdWJzdHJpbmcoMCwgdHlwZUlkc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyh0eXBlSWRzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclRvb2xUaXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclRvb2xUaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5NzNhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJUb29sVGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MMlRleHRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5Ub29sVGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlcnZlclRvb2xUaXA7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUb29sVGlwIGV4dGVuZHMgVG9vbFRpcCB7CQotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLEFycmF5TGlzdDxJU2VydmVyVG9vbFRpcD4+IHRvb2xUaXBQcm92aWRlcnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+PigpOwkKLQlwcm90ZWN0ZWQgc3RhdGljIFNoZWxsIENVUlJFTlRfVE9PTFRJUDsKLQlwcm90ZWN0ZWQgTGFiZWwgaGludExhYmVsOwotCXByb3RlY3RlZCBUcmVlIHRyZWU7Ci0JcHJvdGVjdGVkIGludCB4OwotCXByb3RlY3RlZCBpbnQgeTsKLQotCXB1YmxpYyBTZXJ2ZXJUb29sVGlwKGZpbmFsIFRyZWUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQkJCi0JCXRoaXMudHJlZSA9IHRyZWU7Ci0JCQotCQl0cmVlLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCQl4ID0gZS54OwotCQkJCXkgPSBlLnk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdHJlZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50ICBlKSB7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRVNDKSB7Ci0JCQkJCUNVUlJFTlRfVE9PTFRJUC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJQ1VSUkVOVF9UT09MVElQLmRpc3Bvc2UoKTsKLQkJCQkJYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRjYpIHsKLQkJCQkJZGVhY3RpdmF0ZSgpOwotCQkJCQloaWRlKCk7Ci0JCQkJCWNyZWF0ZUZvY3VzZWRUb29sdGlwKHRyZWUpOwkJCQkJCi0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSl7Ci0JCQkJLy8gbm90aGluZyB0byBkbyAKLQkJCX0KLQkJfSk7Ci0JCQotCQlsb2FkRXh0ZW5zaW9ucygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGb2N1c2VkVG9vbHRpcChmaW5hbCBDb250cm9sIGNvbnRyb2wpIHsKLQkJZmluYWwgU2hlbGwgc3RpY2t5VG9vbHRpcCA9IG5ldyBTaGVsbChjb250cm9sLmdldFNoZWxsKCksIFNXVC5PTl9UT1AgfCBTV1QuVE9PTAotCQkJCXwgU1dULk5PX0ZPQ1VTKTsKLQkJc3RpY2t5VG9vbHRpcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXN0aWNreVRvb2x0aXAuc2V0QmFja2dyb3VuZChzdGlja3lUb29sdGlwLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQotCQljb250cm9sLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJZXZlbnQueCA9IHg7Ci0JCQkJZXZlbnQueSA9IHk7Ci0JCQkJZXZlbnQud2lkZ2V0ID0gdHJlZTsKLQkJCQkKLQkJCQljcmVhdGVUb29sVGlwQ29udGVudEFyZWEoZXZlbnQsIHN0aWNreVRvb2x0aXApOwotCQkJCXN0aWNreVRvb2x0aXAucGFjaygpOwotCQkJCQotCQkJCXN0aWNreVRvb2x0aXAuc2V0TG9jYXRpb24oc3RpY2t5VG9vbHRpcC5nZXREaXNwbGF5KCkuZ2V0Q3Vyc29yTG9jYXRpb24oKSk7CQkJCQotCQkJCWhpbnRMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnRvb2xUaXBEaXNhYmxlRm9jdXMpOwotCQkJCXN0aWNreVRvb2x0aXAuc2V0VmlzaWJsZSh0cnVlKTsKLS8vCQkJCUV2ZW50dWFsbHkgd2Ugd2FudCB0byBhZGQgYSBsaXN0ZW5lciB0aGF0IGNoZWNrcyBpZgotLy8gICAgICAgICAgICAgIHRoZSBtb3VzZURvd24gZXZlbnQgaXMgb2NjdXJyaW5nIG91dHNpZGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgdG9vbHRpcAotLy8gICAgICAgICAgICAgIGlmIGl0IGlzLCB0aGVuIGhpZGUgdGhlIHRvb2x0aXAKLS8vCQkJCWFkZExpc3RlbmVyKHN0aWNreVRvb2x0aXApOwotCQkJfQotCQl9KTsKLQkJQ1VSUkVOVF9UT09MVElQID0gc3RpY2t5VG9vbHRpcDsKLQl9Ci0KLS8vICByZWFkIHRoZSBjcmVhdGVGb2N1c2VkVG9vbHRpcCBtZXRob2QgZm9yIGluZm9ybWF0aW9uIG9uIHdoeSB0aGlzIGlzIGNvbW1lbnRlZCBvdXQKLS8vCi0vLwlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXIoQ29udHJvbCBjb250cm9sKXsKLS8vCQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IFN0aWNreVRpcE1vdXNlTGlzdGVuZXIoKSk7Ci0vLwkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpewotLy8JCQlDb250cm9sW10gY2hpbGRyZW5zID0gKChDb21wb3NpdGUpY29udHJvbCkuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJZm9yIChDb250cm9sIGNoaWxkIDpjaGlsZHJlbnMpewotLy8JCQkJYWRkTGlzdGVuZXIoY2hpbGQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VG9vbFRpcEFyZWEoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG8gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsZXZlbnQueSkpOwotCQlyZXR1cm4gbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRDcmVhdGVUb29sVGlwKEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0cmVlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuc2hvdWxkQ3JlYXRlVG9vbFRpcChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb29sVGlwQ29udGVudEFyZWEoRXZlbnQgZXZlbnQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJT2JqZWN0IG8gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQlJU2VydmVyTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCU9iamVjdCBvYmogPSAoKFRyZWVJdGVtKW8pLmdldERhdGEoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJCXNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlck1vZHVsZSkKLQkJCQltb2R1bGUgPSAoSVNlcnZlck1vZHVsZSkgb2JqOwotCQl9Ci0JCQotCQlGaWxsTGF5b3V0IGxheW91dCA9IChGaWxsTGF5b3V0KXBhcmVudC5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCS8vIHNldCB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgdG9vbHRpcAotCQlTdHlsZWRUZXh0IHNUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJc1RleHQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBtb2R1bGUuZ2V0TW9kdWxlKCk7Ci0JCQlJTW9kdWxlIG0gPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQlzVGV4dC5zZXRUZXh0KCI8Yj4iICsgbS5nZXROYW1lKCkgKyAiPC9iPiIpOwotCQkJLy9zVGV4dC5zZXRUZXh0KCI8Yj4iICsgbS5nZXROYW1lKCkgKyAiPC9iPjwvcD4iICsgbS5nZXRNb2R1bGVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJCQotCQkJU3R5bGVkVGV4dCBzVGV4dDIgPSBuZXcgU3R5bGVkVGV4dChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNUZXh0Mi5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQlzVGV4dDIuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCXNUZXh0Mi5zZXRUZXh0KG0uZ2V0TW9kdWxlVHlwZSgpLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc1RleHQuc2V0VGV4dCgiPGI+IiArIHNlcnZlci5nZXROYW1lKCkgKyAiPC9iPiIpOwotCQkJCi0JCQkvLyBhZGQgYWRvcHRlcnMgY29udGVudAotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJCUFycmF5TGlzdDxJU2VydmVyVG9vbFRpcD4gbGlzdE9mUHJvdmlkZXJzID0gdG9vbFRpcFByb3ZpZGVycy5nZXQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQkKLQkJCQlmaW5hbCBDb21wb3NpdGUgYWRvcHRlcnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCQkJYWRvcHRlcnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCWFkb3B0ZXJzQ29tcG9zaXRlLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkJCi0JCQkJaWYgKGxpc3RPZlByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSVNlcnZlclRvb2xUaXAgdGlwUHJvdmlkZXIgOiBsaXN0T2ZQcm92aWRlcnMpIHsKLQkJCQkJCXRpcFByb3ZpZGVyLmNyZWF0ZUNvbnRlbnQoYWRvcHRlcnNDb21wb3NpdGUsc2VydmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gYWRkIHRoZSBGMyB0ZXh0Ci0JCWhpbnRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsU1dULkJPUkRFUik7Ci0JCWhpbnRMYWJlbC5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQkJaGludExhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCWhpbnRMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnRvb2xUaXBFbmFibGVGb2N1cyk7Ci0JCWhpbnRMYWJlbC5zZXRGb3JlZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotCQkKLQkJZmluYWwgRm9udCBmb250OwotCQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQlGb250RGF0YVtdIGZkID0gcGFyZW50LmdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotCQlpbnQgc2l6ZTIgPSBmZC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykKLQkJCWZkW2ldLnNldEhlaWdodCg3KTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkKTsKLQkJcGFyZW50LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWhpbnRMYWJlbC5zZXRGb250KGZvbnQpOwotCQkKLQkJcGFyc2VUZXh0KHNUZXh0LmdldFRleHQoKSxzVGV4dCk7Ci0JCQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlVGV4dChTdHJpbmcgaHRtbFRleHQsU3R5bGVkVGV4dCBzVGV4dCkgewkKLQkJVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24gPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCQlIVE1MMlRleHRSZWFkZXIgcmVhZGVyID0gbmV3IEhUTUwyVGV4dFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGh0bWxUZXh0KSwgcHJlc2VudGF0aW9uKTsKLQkJU3RyaW5nIHRleHQ7Ci0JCQotCQl0cnkgewotCQkJdGV4dCA9IHJlYWRlci5nZXRTdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGV4dD0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJc1RleHQuc2V0VGV4dCh0ZXh0KTsJCQotCQlJdGVyYXRvciBpdGVyID0gcHJlc2VudGF0aW9uLmdldEFsbFN0eWxlUmFuZ2VJdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0eWxlUmFuZ2Ugc3IgPSAoU3R5bGVSYW5nZSlpdGVyLm5leHQoKTsKLQkJCXNUZXh0LnNldFN0eWxlUmFuZ2Uoc3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25zKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyBzZXJ2ZXJUb29sVGlwIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJCi0JCS8vIHNlYXJjaCBmb3IgZXh0ZW5zaW9uIHBvaW50cyAKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4dGVuc2lvbnMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VydmVyVG9vbFRpcCIpOwotCQkKLQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspewkJCQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4RWxlbWVudCA9IGV4dGVuc2lvbnNbaV07Ci0JCQkKLQkJCS8vIFNvcnQgdGhlIGV4dGVuc2lvbnMgYmFzZWQgb24gc2VydmVyVHlwZQotCQkJU3RyaW5nIGV4U2VydmVyVHlwZSA9IGV4RWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclR5cGVzIik7Ci0JCQkKLQkJCWZvciAoSVNlcnZlclR5cGUgc2VydmVyVHlwZSA6IHNlcnZlclR5cGVzKSB7Ci0JCQkJaWYgKGV4U2VydmVyVHlwZS5jb21wYXJlVG8oIioiKSA9PSAwIHx8IAotCQkJCQkJZXhTZXJ2ZXJUeXBlLnN0YXJ0c1dpdGgoc2VydmVyVHlwZS5nZXRJZCgpKSA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJU2VydmVyVG9vbFRpcCBleFRvb2x0aXAgPSAoSVNlcnZlclRvb2xUaXApIGV4RWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQkJQXJyYXlMaXN0PElTZXJ2ZXJUb29sVGlwPiBsaXN0T2ZQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJUb29sVGlwPigpOyAKLQkJCQkJCWlmICh0b29sVGlwUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHNlcnZlclR5cGUpKSB7Ci0JCQkJCQkJbGlzdE9mUHJvdmlkZXJzID0gdG9vbFRpcFByb3ZpZGVycy5nZXQoc2VydmVyVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlsaXN0T2ZQcm92aWRlcnMuYWRkKGV4VG9vbHRpcCk7Ci0JCQkJCQl0b29sVGlwUHJvdmlkZXJzLnB1dChzZXJ2ZXJUeXBlLmdldElkKCksIGxpc3RPZlByb3ZpZGVycyk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiVG9vbHRpcCBmYWlsZWQgdG8gbG9hZCIgKyBleHRlbnNpb25zW2ldLnRvU3RyaW5nKCksIGUpOwotCQkJCQl9Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHNlcnZlclRvb2xUaXA6ICIgKyBleHRlbnNpb25zW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0vLyAgcmVhZCB0aGUgY3JlYXRlRm9jdXNlZFRvb2x0aXAgbWV0aG9kIGZvciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhpcyBpcyBjb21tZW50ZWQgb3V0Ci0vLwotLy8JcHJvdGVjdGVkIGNsYXNzIFN0aWNreVRpcE1vdXNlTGlzdGVuZXIgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyewotLy8KLS8vCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotLy8JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0vLwkJCQotLy8JCX0KLS8vCi0vLwkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotLy8JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibW91c2VEb3duIik7Ci0vLwkJCWlmIChDVVJSRU5UX1RPT0xUSVAuZ2V0Qm91bmRzKCkuY29udGFpbnMobmV3IFBvaW50KGUueCxlLnkpKSA9PSB0cnVlKXsKLS8vCQkJCUNVUlJFTlRfVE9PTFRJUC5zZXRWaXNpYmxlKGZhbHNlKTsKLS8vCQkJCUNVUlJFTlRfVE9PTFRJUC5kaXNwb3NlKCk7Ci0vLwkJCQlhY3RpdmF0ZSgpOwotLy8JCQkJQ1VSUkVOVF9UT09MVElQLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0vLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQkJCi0vLwkJfQotLy8JCQotLy8JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwOWJkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLklTZXJ2ZXJFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBzZXJ2ZXIgVUkgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOwotCi0JLy8gc2VydmVyIFVJIHBsdWdpbiBpZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9TRVJWRVJfSU1BR0VTID0gInNlcnZlckltYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9XSVpBUkRfRlJBR01FTlRTID0gIndpemFyZEZyYWdtZW50cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0VESVRPUl9QQUdFUyA9ICJlZGl0b3JQYWdlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0VESVRPUl9QQUdFX1NFQ1RJT05TID0gImVkaXRvclBhZ2VTZWN0aW9ucyI7Ci0KLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVEFSVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUT1AgPSAxOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFU1RBUlQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0TGF1bmNoYWJsZUFkYXB0ZXIgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hhYmxlLmFkYXB0ZXIuZGVmYXVsdCI7Ci0JCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gImxhdW5jaGFibGUiOwotCQl9Ci0JfQotCi0JLy8gc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJVSVBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgTWFwIGltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgd2l6YXJkcwotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4gd2l6YXJkRnJhZ21lbnRzOwotCi0JLy8gY2FjaGVkIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyCi0JcHJpdmF0ZSBzdGF0aWMgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJRXh0ZW5zaW9uRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQloYW5kbGVXaXphcmRGcmFnbWVudERlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX0lNQUdFUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlJbWFnZVJlc291cmNlLmhhbmRsZVNlcnZlckltYWdlRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9FRElUT1JfUEFHRVMpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU2VydmVyRWRpdG9yQ29yZS5oYW5kbGVFZGl0b3JQYWdlRmFjdG9yaWVzRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlTZXJ2ZXJFZGl0b3JDb3JlLmhhbmRsZUVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgV2l6YXJkRnJhZ21lbnREYXRhIHsKLQkJU3RyaW5nIGlkOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2U7Ci0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50OwotCQkKLQkJcHVibGljIFdpemFyZEZyYWdtZW50RGF0YShTdHJpbmcgaWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5jZSA9IGNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PElTZXJ2ZXI+IHRlcm1pbmF0aW9uV2F0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQotCXByb3RlY3RlZCBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgc2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJU2VydmVyTGlzdGVuZXIgc2VydmVyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJLy8gaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJc2hvd1NlcnZlcnNWaWV3KHRydWUpOwotCQkJfSBlbHNlIGlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgewotCQkJCXNob3dTZXJ2ZXJzVmlldyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lciA9IG5ldyBQdWJsaXNoQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCXNob3dTZXJ2ZXJzVmlldyhmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgU2VydmVyVUlQbHVnaW4uCi0JICovCi0JcHVibGljIFNlcnZlclVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyVUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgVUkgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHJldHVybiBTZXJ2ZXJVSVByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJVSVByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbmV3IFNlcnZlclVJUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItLS0tLT4tLS0tLSBTZXJ2ZXIgVUkgcGx1Z2luIHN0YXJ0IC0tLS0tPi0tLS0tIik7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJU2VydmVyVUlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldERlZmF1bHRzKCk7Ci0JCQotCQlTZXJ2ZXJDb3JlLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKTsKLQkJCi0JCUluaXRpYWxpemVKb2Igam9iID0gbmV3IEluaXRpYWxpemVKb2IoKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0tLS0tPC0tLS0tIFNlcnZlciBVSSBwbHVnaW4gc3RvcCAtLS0tLTwtLS0tLSIpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQkKLQkJaWYgKHJlZ2lzdHJ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUltYWdlUmVzb3VyY2UuZGlzcG9zZSgpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VydmVyc1tpXS5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcnNbaV0pLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCQotCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgd2F0Y2ggdG8gdGhpcyBzZXJ2ZXIuIElmIGl0IGhhc24ndCBzdG9wcGVkIGluIGEKLQkgKiByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvCi0JICogdGVybWluYXRlIHRoZSBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kZSBhIGRlYnVnIG1vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGVybWluYXRpb25XYXRjaChmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgSVNlcnZlciBzZXJ2ZXIsIGZpbmFsIGludCBtb2RlKSB7Ci0JCWlmICh0ZXJtaW5hdGlvbldhdGNoZXMuY29udGFpbnMoc2VydmVyKSkKLQkJCXJldHVybjsKLQkJCi0JCXRlcm1pbmF0aW9uV2F0Y2hlcy5hZGQoc2VydmVyKTsKLQkJCi0JCWNsYXNzIFRlcm1pbmF0ZVRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhbGl2ZSA9IHRydWU7Ci0JCQlwdWJsaWMgSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyOwotCi0JCQlwdWJsaWMgVGVybWluYXRlVGhyZWFkKCkgewotCQkJCXN1cGVyKCJTZXJ2ZXIgVGVybWluYXRpb24gVGhyZWFkIik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl3aGlsZSAoYWxpdmUpIHsKLQkJCQkJaW50IGRlbGF5ID0gc2VydmVyLmdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKLQkJCQkJaWYgKG1vZGUgPT0gMSkKLQkJCQkJCWRlbGF5ID0gc2VydmVyLmdldFN0b3BUaW1lb3V0KCkgKiAxMDAwOwotCQkJCQllbHNlIGlmIChtb2RlID09IDIpCi0JCQkJCQlkZWxheSArPSBzZXJ2ZXIuZ2V0U3RvcFRpbWVvdXQoKSAqIDEwMDA7Ci0JCQkJCQotCQkJCQlpZiAoZGVsYXkgPCAwKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQkJYWxpdmUgPSBmYWxzZTsKLQkKLQkJCQkJaWYgKGFsaXZlKSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlUZXJtaW5hdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgVGVybWluYXRpb25EaWFsb2coc2hlbGwsIHNlcnZlci5nZXROYW1lKCkpOwotCQkJCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQkJCQkJCQkvLyBvbmx5IHRyeSBjYWxsaW5nIHRlcm1pbmF0ZSBvbmNlLiBBbHNvLCBtYWtlIHN1cmUgdGhhdCBpdCBkaWRuJ3Qgc3RvcCB3aGlsZQotCQkJCQkJCQkJLy8gdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQkJCQkJCQlzZXJ2ZXIuc3RvcCh0cnVlKTsKLQkJCQkJCQkJCWFsaXZlID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlpZiAoIWFsaXZlKSB7Ci0JCQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCQkJdGVybWluYXRpb25XYXRjaGVzLnJlbW92ZShzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCWZpbmFsIFRlcm1pbmF0ZVRocmVhZCB0ID0gbmV3IFRlcm1pbmF0ZVRocmVhZCgpOwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSAtIDIpOwotCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RvcCB0aGUgdGhyZWFkIGlmL3doZW4gdGhlIHNlcnZlciBzdG9wcwotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaWYgKHNlcnZlcjIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCQl0LmFsaXZlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0Lmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCi0JCXQuc3RhcnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRoYXQgY2FtZSBmcm9tIHRoZSBnaXZlbiBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogc2VydmVycyAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhIG1hdGNoaW5nCi0JICogbG9jYXRpb24gKHtAbGluayBTZXJ2ZXIjZ2V0RmlsZSgpfSkuIFRoZSBmaWxlIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgc2VydmVyIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAotCSAqIHRoZXJlIGlzIG5vIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZmluZFNlcnZlcihJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoZmlsZS5lcXVhbHMoKChTZXJ2ZXIpc2VydmVyc1tpXSkuZ2V0RmlsZSgpKSkKLQkJCQkJcmV0dXJuIHNlcnZlcnNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgaW5zdGFuY2VzIG9mCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgZmlsdGVycyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHJ1bnRpbWUgKHtAbGluayBTZXJ2ZXJDb3JlI2dldFJ1bnRpbWVzKCl9KSBmb3Igb25lcyB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBydW50aW1lIHR5cGUgKHtAbGluayBJUnVudGltZSNnZXRSdW50aW1lVHlwZSgpfSkuIFRoZSBhcnJheSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gYW55IHdvcmtpbmcgY29waWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lVHlwZSB0aGUgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgcnVudGltZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lfQotCSAqIG9mIHRoZSBnaXZlbiBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lW10gZ2V0UnVudGltZXMoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCUxpc3Q8SVJ1bnRpbWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgcnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKS5lcXVhbHMocnVudGltZVR5cGUpKQotCQkJCQlsaXN0LmFkZChydW50aW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSdW50aW1lW10gciA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogT3BlbiB0aGUgZ2l2ZW4gc2VydmVyIHdpdGggdGhlIHNlcnZlciBlZGl0b3IuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVkaXRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJZWRpdFNlcnZlcihzZXJ2ZXIuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiB0aGUgZ2l2ZW4gc2VydmVyIGlkIHdpdGggdGhlIHNlcnZlciBlZGl0b3IuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVySWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZWRpdFNlcnZlcihTdHJpbmcgc2VydmVySWQpIHsKLQkJaWYgKHNlcnZlcklkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkKLQkJdHJ5IHsKLQkJCUlTZXJ2ZXJFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBTZXJ2ZXJFZGl0b3JJbnB1dChzZXJ2ZXJJZCk7Ci0JCQlwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIElTZXJ2ZXJFZGl0b3JJbnB1dC5FRElUT1JfSUQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBzZXJ2ZXIgZWRpdG9yIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHByZWZlcmVuY2UgdG8gcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgZGlydHkgZWRpdG9ycywgaWYgYXBwbGljYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gIC0gUmV0dXJucyBmYWxzZSBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlRWRpdG9ycygpIHsKLQkJYnl0ZSBiID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRTYXZlRWRpdG9ycygpOwotCQlpZiAoYiA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19ORVZFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5zYXZlQWxsRWRpdG9ycyhiID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVCk7CQkJCi0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciBpZiB0aGUgc2VydmVyIGlzIGRpcnR5LiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciB3YXMKLQkgKiBub3QgZGlydHkgb3IgaWYgdGhlIHVzZXIgZGVjaWRlZCB0byBjb250aW51ZSBhbnl3YXkuIFJldHVybnMgZmFsc2UgaWYKLQkgKiB0aGUgc2VydmVyIGlzIGRpcnR5IGFuZCB0aGUgdXNlciBjaG9zZSB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRJZkRpcnR5KFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIShzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMucmVzb3VyY2VEaXJ0eURpYWxvZ1RpdGxlOwotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlpZiAod2MuaXNEaXJ0eSgpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlc291cmNlRGlydHlEaWFsb2dNZXNzYWdlLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbXSB7TWVzc2FnZXMucmVzb3VyY2VEaXJ0eURpYWxvZ0NvbnRpbnVlLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTiwgbGFiZWxzLCAwKTsKLQkKLQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNob3cgdGhlIFNlcnZlcnMgdmlldy4gVGhlIFNlcnZlcnMgaXMgbmV2ZXIgZ2l2ZW4gZm9jdXMuCi0JICogCi0JICogQHBhcmFtIGJyaW5nVG9Gcm9udCA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSBTZXJ2ZXJzIHZpZXcgcHVzaCB0byB0aGUgdG9wCi0JICogICAgb2YgdGhlIHotb3JkZXIsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8ganVzdCBoaWdobGlnaHQgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2hvd1NlcnZlcnNWaWV3KGZpbmFsIGJvb2xlYW4gYnJpbmdUb0Zyb250KSB7Ci0JCWlmICghZ2V0UHJlZmVyZW5jZXMoKS5nZXRTaG93T25BY3Rpdml0eSgpKQotCQkJcmV0dXJuOwotCQkKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQlpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTm8gYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3ciKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQotCQkJCQlJVmlld1BhcnQgdmlldzIgPSBwYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotCQkJCQkKLQkJCQkJaWYgKHZpZXcyICE9IG51bGwpIHsKLQkJCQkJCWlmIChicmluZ1RvRnJvbnQpCi0JCQkJCQkJcGFnZS5icmluZ1RvVG9wKHZpZXcyKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIHdzcHMgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpCi0JCQkJCQkJCXZpZXcyLmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJCQl3c3BzLndhcm5PZkNvbnRlbnRDaGFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQlwYWdlLnNob3dWaWV3KFZJRVdfSUQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgU2VydmVycyB2aWV3IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciBpcyBhbHJlYWR5IHN0YXJ0ZWQgaW4gdGhlIGdpdmVuCi0JICogbW9kZSwgb3IgY291bGQgYmUgKHJlKXN0YXJ0ZWQgaW4gdGhlIHN0YXJ0IG1vZGUuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlpZiAoc2VydmVyID09IG51bGwgfHwgbGF1bmNoTW9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgJiYgbGF1bmNoTW9kZS5lcXVhbHMoc2VydmVyLmdldE1vZGUoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBydW50aW1lIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSB0eXBlIGEgbW9kdWxlIHR5cGUgaWQKLQkgKiBAcGFyYW0gdmVyc2lvbiBhIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgYSBuZXcgcnVudGltZSB3YXMgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyB2ZXJzaW9uLCBmaW5hbCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChuZXcgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpKTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCX0KLQkJfTsKLQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZChNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIGZyYWdtZW50KTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVJZCBhIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyBydW50aW1lIHdhcyBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBudWxsOwotCQlpZiAocnVudGltZVR5cGVJZCAhPSBudWxsKQotCQkJcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShydW50aW1lVHlwZUlkKTsKLQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKLQkJCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZSk7Ci0JCQkJCi0JCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQkJCWxpc3QuYWRkKGdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVUeXBlSWQpKTsKLQkJCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlUYXNrV2l6YXJkIHdpemFyZCA9IG5ldyBUYXNrV2l6YXJkKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVXaXphcmRUaXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7Ci0JCQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG51bGwsIG51bGwsIHJ1bnRpbWVUeXBlSWQpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBzZXJ2ZXIgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHR5cGVJZCBhIG1vZHVsZSB0eXBlIGlkLCBvciBudWxsIGZvciBhbnkgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbklkIGEgbW9kdWxlIHZlcnNpb24sIG9yIG51bGwgZm9yIGFueSB2ZXJzaW9uCi0JICogQHBhcmFtIHNlcnZlclR5cGVJZCBhIHNlcnZlciBydW50aW1lIHR5cGUsIG9yIG51bGwgZm9yIGFueSB0eXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHNlcnZlciB3YXMgY3JlYXRlZCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdTZXJ2ZXJXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0eXBlSWQsIGZpbmFsIFN0cmluZyB2ZXJzaW9uSWQsIGZpbmFsIFN0cmluZyBzZXJ2ZXJUeXBlSWQpIHsKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQobmV3IE5ld1NlcnZlcldpemFyZEZyYWdtZW50KG5ldyBNb2R1bGVUeXBlKHR5cGVJZCwgdmVyc2lvbklkKSwgc2VydmVyVHlwZUlkKSk7Ci0JCQkJCi0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlU2VydmVyRnJhZ21lbnQpOwotCQkJCQotCQkJCWxpc3QuYWRkKG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCi0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVNlcnZlckZyYWdtZW50KTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlSG9zdG5hbWVGcmFnbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUYXNrV2l6YXJkIHdpemFyZCA9IG5ldyBUYXNrV2l6YXJkKE1lc3NhZ2VzLndpek5ld1NlcnZlcldpemFyZFRpdGxlLCBmcmFnbWVudCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBpZCBoYXMgcG9zc2libGUgd2l6YXJkIGZyYWdtZW50cywgYW5kCi0JICogZmFsc2Ugb3RoZXJ3aXNlLgotCSAqCi0JICogQHBhcmFtIHR5cGVJZCB0aGUgc2VydmVyIG9yIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaWQgaGFzIHBvc3NpYmxlIHdpemFyZCBmcmFnbWVudHMsIGFuZAotCSAqICAgIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNXaXphcmRGcmFnbWVudChTdHJpbmcgdHlwZUlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICh3aXphcmRGcmFnbWVudHMgPT0gbnVsbCkKLQkJCWxvYWRXaXphcmRGcmFnbWVudHMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gd2l6YXJkRnJhZ21lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodHlwZUlkLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZUlkIHRoZSBzZXJ2ZXIgb3IgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiBhIHdpemFyZCBmcmFnbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2l6YXJkRnJhZ21lbnQgZ2V0V2l6YXJkRnJhZ21lbnQoU3RyaW5nIHR5cGVJZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmICh3aXphcmRGcmFnbWVudHMgPT0gbnVsbCkKLQkJCWxvYWRXaXphcmRGcmFnbWVudHMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gd2l6YXJkRnJhZ21lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodHlwZUlkLmVxdWFscyhrZXkpKSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnREYXRhIGRhdGEgPSB3aXphcmRGcmFnbWVudHMuZ2V0KGtleSk7Ci0JCQkJcmV0dXJuIGdldFdpemFyZEZyYWdtZW50KGRhdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHdpemFyZCBmcmFnbWVudHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFdpemFyZEZyYWdtZW50cygpIHsKLQkJaWYgKHdpemFyZEZyYWdtZW50cyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAud2l6YXJkRnJhZ21lbnRzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyk7Ci0JCQotCQlNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnREYXRhPihjZi5sZW5ndGgpOwotCQlsb2FkV2l6YXJkRnJhZ21lbnRzKGNmLCBtYXApOwotCQlhZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCXdpemFyZEZyYWdtZW50cyA9IG1hcDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLndpemFyZEZyYWdtZW50cyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB3aXphcmQgZnJhZ21lbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRXaXphcmRGcmFnbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4gbWFwKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIik7Ci0JCQkJU3RyaW5nW10gaWRzID0gdG9rZW5pemUoaWQsICIsIik7Ci0JCQkJaW50IHNpemUgPSBpZHMubGVuZ3RoOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKQotCQkJCQltYXAucHV0KGlkc1tqXSwgbmV3IFdpemFyZEZyYWdtZW50RGF0YShpZCwgY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCB3aXphcmRGcmFnbWVudDogIiArIGlkKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCB3aXphcmRGcmFnbWVudDogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKgotCSAqIEByZXR1cm4gYW4gaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBnZXRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKQotCQkJbG9hZEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkKLQkJcmV0dXJuIHNlbGVjdGlvblByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLmluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgImluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIpOwotCQkKLQkJaWYgKGNmLmxlbmd0aCA9PSAxKSB7Ci0JCQl0cnkgewotCQkJCXNlbGVjdGlvblByb3ZpZGVyID0gKEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcikgY2ZbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI6ICIgKyBjZlswXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIGluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcjogIiArIGNmWzBdLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2YubGVuZ3RoID4gMSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJNb3JlIHRoYXQgb25lIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyIGZvdW5kIC0gaWdub3JpbmciKTsKLQkJZWxzZQotCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTm8gaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIgZm91bmQiKTsKLQkJCi0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKQotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgV2l6YXJkRnJhZ21lbnQgZ2V0V2l6YXJkRnJhZ21lbnQoV2l6YXJkRnJhZ21lbnREYXRhIGZyYWdtZW50KSB7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoZnJhZ21lbnQuZnJhZ21lbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlmcmFnbWVudC5mcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgZnJhZ21lbnQuY2UuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZnJhZ21lbnQuY2UuZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB3aXphcmRGcmFnbWVudDogIiArIGZyYWdtZW50LmNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZyYWdtZW50LmZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5PblNlcnZlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKTsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQkvLyBkdW1teSBhY3Rpb24KLQkJfTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsKTsKLQkJfSBlbHNlCi0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgbnVsbCk7Ci0KLQkJZGVsZWdhdGUucnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZWdpc3RyeUxpc3RlbmVyKCkgewotCQlpZiAocmVnaXN0cnlMaXN0ZW5lciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcmVnaXN0cnlMaXN0ZW5lciA9IG5ldyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LmFkZFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lciwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlV2l6YXJkRnJhZ21lbnREZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKHdpemFyZEZyYWdtZW50cyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+KHdpemFyZEZyYWdtZW50cyk7Ci0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKSB7Ci0JCQlsb2FkV2l6YXJkRnJhZ21lbnRzKGNmLCBtYXApOwotCQl9IGVsc2UgewotCQkJLyppbnQgc2l6ZSA9IHdpemFyZEZyYWdtZW50cy5zaXplKCk7Ci0JCQlXaXphcmRGcmFnbWVudFtdIHdmID0gbmV3IFdpemFyZEZyYWdtZW50W3NpemVdOwotCQkJd2l6YXJkRnJhZ21lbnRzLnRvQXJyYXkod2YpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAod2ZbaV0uZ2V0SWQoKS5lcXVhbHMoY2Zbal0uZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCQkJd2ZbaV0uZGlzcG9zZSgpOwotCQkJCQkJd2l6YXJkRnJhZ21lbnRzLnJlbW92ZSh3ZltpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ki8KLQkJfQotCQl3aXphcmRGcmFnbWVudHMgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gdG9rZW5pemUgYSBzdHJpbmcgaW50byBhbiBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyIGEgc3RyaW5nIHRvIGJlIHBhcnNlZAotCSAqIEBwYXJhbSBkZWxpbSB0aGUgZGVsaW1pdGVycwotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdG9rZW5pemVkIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemUoU3RyaW5nIHN0ciwgU3RyaW5nIGRlbGltKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBkZWxpbSk7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJCWxpc3QuYWRkKHMudHJpbSgpKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhdW5jaGFibGUgY2xpZW50cyBmb3IgdGhlIGdpdmVuIHNlcnZlciBhbmQgbGF1bmNoYWJsZQotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICogQHBhcmFtIGxhdW5jaGFibGUKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsaWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGllbnRbXSBnZXRDbGllbnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsIHx8IGxhdW5jaGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsaWVudFswXTsKLQkJCi0JCUFycmF5TGlzdDxJQ2xpZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xpZW50Pig1KTsKLQkJSUNsaWVudFtdIGNsaWVudHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0Q2xpZW50cygpOwotCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNsaWVudHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJjbGllbnQ9ICIgKyBjbGllbnRzW2ldKTsKLQkJCQlpZiAoY2xpZW50c1tpXS5zdXBwb3J0cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpKQotCQkJCQlsaXN0LmFkZChjbGllbnRzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSUNsaWVudFtdIGNsaWVudHMyID0gbmV3IElDbGllbnRbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY2xpZW50czIpOwotCQlyZXR1cm4gY2xpZW50czI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRMYXVuY2hhYmxlQWRhcHRlcihJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hhYmxlQWRhcHRlcltdIGFkYXB0ZXJzID0gU2VydmVyUGx1Z2luLmdldExhdW5jaGFibGVBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUyID0gYWRhcHRlcnMubGVuZ3RoOwotCQkJSVN0YXR1cyBsYXN0U3RhdHVzID0gbnVsbDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUlMYXVuY2hhYmxlQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbal07Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IGxhdW5jaGFibGUyID0gYWRhcHRlci5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJhZGFwdGVyPSAiICsgYWRhcHRlciArICIsIGxhdW5jaGFibGU9ICIgKyBsYXVuY2hhYmxlMik7Ci0JCQkJCWlmIChsYXVuY2hhYmxlMiAhPSBudWxsKQotCQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGFkYXB0ZXIsIGxhdW5jaGFibGUyIH07Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlsYXN0U3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gbGF1bmNoYWJsZSBhZGFwdGVyIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxhc3RTdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihsYXN0U3RhdHVzKTsKLQkJfQotCQkKLQkJLy8gYmFja3VwCi0JCUlMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlciA9IFNlcnZlclBsdWdpbi5maW5kTGF1bmNoYWJsZUFkYXB0ZXIoRGVmYXVsdExhdW5jaGFibGVBZGFwdGVyLklEKTsKLQkJT2JqZWN0IGxhdW5jaGFibGUgPSBsYXVuY2hhYmxlQWRhcHRlci5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbGF1bmNoYWJsZUFkYXB0ZXIsIGxhdW5jaGFibGUgfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKE9iamVjdFtdIG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gb2JqOwotCQkKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKG9ialtpXSBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBvYmpbaV07Ci0JCQkJSU1vZHVsZVtdIG0gPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMocHJvaik7Ci0JCQkJaW50IHNpemUyID0gbS5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKQotCQkJCQlsaXN0LmFkZChtW2pdKTsKLQkJCX0KLQkJfQotCQkKLQkJT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobyk7Ci0JCXJldHVybiBvOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NmQ2OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHNlcnZlciB0b29scyBVSS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclVJUHJlZmVyZW5jZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lNUE9SVF9MT0NBVElPTiA9ICJpbXBvcnQtbG9jYXRpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NBVkVfRURJVE9SUyA9ICJzYXZlLWVkaXRvcnMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0hPU1RfTkFNRVMgPSAiaG9zdC1uYW1lcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPV19PTl9BQ1RJVklUWSA9ICJzaG93LW9uLWFjdGl2aXR5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVVOQ0hfTU9ERSA9ICJsYXVuY2gtbW9kZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTEFVTkNIX01PREUyID0gImxhdW5jaC1tb2RlMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX0JSRUFLUE9JTlRTID0gImVuYWJsZS1icmVha3BvaW50cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkVTVEFSVCA9ICJyZXN0YXJ0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DUkVBVEVfU0VSVkVSX1dJVEhfUlVOVElNRSA9ICJjcmVhdGUtc2VydmVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQVZFX0VESVRPUlNfQUxXQVlTID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX05FVkVSID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX1BST01QVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREVfUFJPTVBUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREVfQ09OVElOVUUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERV9SRVNUQVJUID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERTJfUFJPTVBUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX0NPTlRJTlVFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX1JFU1RBUlQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUyA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFTkFCTEVfQlJFQUtQT0lOVFNfTkVWRVIgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFU1RBUlRfUFJPTVBUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVTVEFSVF9BTFdBWVMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUX05FVkVSID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSE9TVE5BTUVTID0gMTA7Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCi0JLyoqCi0JICogU2VydmVyVUlQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclVJUHJlZmVyZW5jZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXByZWZlcmVuY2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTEFVTkNIX01PREUsIGdldERlZmF1bHRMYXVuY2hNb2RlKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTEFVTkNIX01PREUyLCBnZXREZWZhdWx0TGF1bmNoTW9kZTIoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9FTkFCTEVfQlJFQUtQT0lOVFMsIGdldERlZmF1bHRFbmFibGVCcmVha3BvaW50cygpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1JFU1RBUlQsIGdldERlZmF1bHRSZXN0YXJ0KCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfU0FWRV9FRElUT1JTLCBnZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9IT1NUX05BTUVTLCAibG9jYWxob3N0Iik7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TSE9XX09OX0FDVElWSVRZLCB0cnVlKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0NSRUFURV9TRVJWRVJfV0lUSF9SVU5USU1FLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAotCSAqIHdoZW4gdGhlIGxhdW5jaCBtb2RlIG9mIHRoZSBzZXJ2ZXIgZG9lc24ndCBtYXRjaC4KLQkgKgotCSAqIEByZXR1cm4gYnl0ZQotCSAqLwotCXB1YmxpYyBieXRlIGdldERlZmF1bHRMYXVuY2hNb2RlKCkgewotCQlyZXR1cm4gTEFVTkNIX01PREVfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgbGF1bmNoIG1vZGUKLQkgKiBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExhdW5jaE1vZGUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9MQVVOQ0hfTU9ERSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB3aGVuIHRoZSBsYXVuY2ggbW9kZQotCSAqIG9mIHRoZSBzZXJ2ZXIgZG9lc24ndCBtYXRjaC4KLQkgKgotCSAqIEBwYXJhbSBiIGEgbGF1bmNoIG1vZGUgY29uc3RhbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hNb2RlKGludCBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfTEFVTkNIX01PREUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQKLQkgKiB3aGVuIHRoZSBsYXVuY2ggbW9kZSBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICoKLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0TGF1bmNoTW9kZTIoKSB7Ci0JCXJldHVybiBMQVVOQ0hfTU9ERTJfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgbGF1bmNoIG1vZGUKLQkgKiBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExhdW5jaE1vZGUyKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTEFVTkNIX01PREUyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGxhdW5jaCBtb2RlCi0JICogb2YgdGhlIHNlcnZlciBkb2Vzbid0IG1hdGNoLgotCSAqCi0JICogQHBhcmFtIGIgYSBsYXVuY2ggbW9kZSBjb25zdGFudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaE1vZGUyKGludCBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfTEFVTkNIX01PREUyLCBiKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkCi0JICogd2hlbiB0aGUgYnJlYWtwb2ludCBlbmFibGVtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJ5dGUgZ2V0RGVmYXVsdEVuYWJsZUJyZWFrcG9pbnRzKCkgewotCQlyZXR1cm4gRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGJyZWFrcG9pbnQKLQkgKiBlbmFibGVtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5hYmxlQnJlYWtwb2ludHMoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9FTkFCTEVfQlJFQUtQT0lOVFMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgYnJlYWtwb2ludAotCSAqIGVuYWJsZW1lbnQgZG9lc24ndCBtYXRjaCB0aGUgc2VydmVyIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIGIgYSBicmVha3BvaW50IGVuYWJsZW1lbnQgY29uc3RhbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVCcmVha3BvaW50cyhpbnQgYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0VOQUJMRV9CUkVBS1BPSU5UUywgYik7Ci0JCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAotCSAqIHdoZW4gdGhlIHNlcnZlciByZXF1aXJlcyByZXN0YXJ0aW5nLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0UmVzdGFydCgpIHsKLQkJcmV0dXJuIFJFU1RBUlRfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgc2VydmVyIHJlcXVpcmVzCi0JICogcmVzdGFydGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzdGFydCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX1JFU1RBUlQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgc2VydmVyIHJlcXVpcmVzIHJlc3RhcnRpbmcuCi0JICoKLQkgKiBAcGFyYW0gYiBhIGJyZWFrcG9pbnQgZW5hYmxlbWVudCBjb25zdGFudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3RhcnQoaW50IGIpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9SRVNUQVJULCBiKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydExvY2F0aW9uKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBSRUZfSU1QT1JUX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcyB0aGUgaW1wb3J0IGxvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0TG9jYXRpb24oU3RyaW5nIHMpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9JTVBPUlRfTE9DQVRJT04sIHMpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSB7Ci0JCXJldHVybiBTQVZFX0VESVRPUlNfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHNhdmluZyBlZGl0b3JzIGJlZm9yZSBsYXVuY2hpbmcuCi0JICogCi0JICogQHJldHVybiBieXRlCi0JICovCi0JcHVibGljIGJ5dGUgZ2V0U2F2ZUVkaXRvcnMoKSB7Ci0JCXJldHVybiAoYnl0ZSkgcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfU0FWRV9FRElUT1JTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVFZGl0b3JzKGJ5dGUgYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NBVkVfRURJVE9SUywgYik7Ci0JCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2hvd09uQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfU0hPV19PTl9BQ1RJVklUWSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIG9wZW5pbmcgdGhlIHNlcnZlcnMgdmlldyBvbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dPbkFjdGl2aXR5KGJvb2xlYW4gYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NIT1dfT05fQUNUSVZJVFksIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb3N0IHJlY2VudGx5IHVzZWQgaG9zdG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvc3RuYW1lcwotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SG9zdG5hbWVzKCkgewotCQlTdHJpbmcgcyA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQUkVGX0hPU1RfTkFNRVMpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICJ8KnwiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3QubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG5ldyBob3N0bmFtZSB0byB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGxpc3QuCi0JICogIAotCSAqIEBwYXJhbSBob3N0bmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQlpZiAoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3RuYW1lKSkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0SG9zdG5hbWVzKCk7Ci0JCQotCQkvLyByZW1vdmUgZHVwbGljYXRlcwotCQlpZiAobGlzdC5jb250YWlucyhob3N0bmFtZSkpCi0JCQlsaXN0LnJlbW92ZShob3N0bmFtZSk7Ci0JCQotCQkvLyBhbHdheXMgYWRkIHNlY29uZCAobGVhdmUgbG9jYWxob3N0IGZpcnN0KQotCQlsaXN0LmFkZCgxLCBob3N0bmFtZSk7Ci0JCQotCQkvLyByZW1vdmUgbGVhc3QgdXNlZCBob3N0bmFtZQotCQlpZiAobGlzdC5zaXplKCkgPiBNQVhfSE9TVE5BTUVTKQotCQkJbGlzdC5yZW1vdmUobGlzdC5zaXplKCkgLSAxKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJc2IuYXBwZW5kKHMpOwotCQkJc2IuYXBwZW5kKCJ8KnwiKTsKLQkJfQotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0hPU1RfTkFNRVMsIHNiLnRvU3RyaW5nKCkpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHdoZXRoZXIgYSBzZXJ2ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBydW50aW1lcwotCSAqIHdoZW4gcG9zc2libGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB3aGV0aGVyIGEgc2VydmVyIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggcnVudGltZXMKLQkgKiB3aGVuIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoYm9vbGVhbiBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NmFkYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvLkF1ZGlvOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCNzdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdWRpbyBzdGFydHVwIik7Ci0KLQkJZmluYWwgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2hGaW5pc2hlZCIpOwotCQkJfQotCQl9OwotCQkKLQkJZmluYWwgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQkJCQlBdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyU3RhcnQiKTsKLQkJCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0b3AiKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZWI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBEaWFsb2cgdGhhdCBwcm9tcHRzIGEgdXNlciB0byBzZWUgaWYgYSBzZXJ2ZXIgc2hvdWxkCi0gKiBiZSB0ZXJtaW5hdGVkLgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyTmFtZTsKLQotCS8qKgotCSAqIFRlcm1pbmF0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyTmFtZSBhIHNlcnZlciBuYW1lCi0JICovCi0JcHVibGljIFRlcm1pbmF0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgc2VydmVyTmFtZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLnRlcm1pbmF0ZVNlcnZlckRpYWxvZ1RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZSwgbmV3IFN0cmluZ1tdIHtzZXJ2ZXJOYW1lfSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNDAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxMmY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIElORk8gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQRVJGT1JNQU5DRSA9IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVYVEVOU0lPTl9QT0lOVCA9IDc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXZlbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLQkJIkNPTkZJRyAiLCAiSU5GTyAgICIsICJXQVJOSU5HIiwgIlNFVkVSRSAiLCAiRklORVIgICIsICJGSU5FU1QgIiwgIlBFUkYgICAiLCAiRVhURU5TSU9OIn07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZC9NTS95eSBISDptbS5zcy5TU1MiKTsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKGxldmVsID09IFNFVkVSRSkKLQkJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQotCQlpZiAoIVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2OTRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9XZWJMYXVuY2hhYmxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJMYXVuY2hhYmxlQ2xpZW50IGV4dGVuZHMgQ2xpZW50RGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBDbGllbnREZWxlZ2F0ZSNzdXBwb3J0cyhJTGF1bmNoYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXJldHVybiAobGF1bmNoYWJsZSBpbnN0YW5jZW9mIEh0dHBMYXVuY2hhYmxlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjbGF1bmNoKElMYXVuY2hhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQlIdHRwTGF1bmNoYWJsZSBodHRwID0gKEh0dHBMYXVuY2hhYmxlKSBsYXVuY2hhYmxlOwotCQl0cnkgewotCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQlicm93c2VyLm9wZW5VUkwoaHR0cC5nZXRVUkwoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBvcGVuaW5nIGJyb3dzZXIiLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdFNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZTEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIExpc3Q8SVNlcnZlcj4gc2VydmVyczsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBlcmZvcm0oU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVNoZWxsIHNoZWxsID0gRWNsaXBzZVV0aWwuZ2V0U2hlbGwoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQlpZiAoYWNjZXB0KHNlcnZlcikpCi0JCQkJcGVyZm9ybShzaGVsbCwgc2VydmVyKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZXJ2ZXJzKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCQlpZiAoYWNjZXB0KHNlcnZlcikpIHsKLQkJCQkJc2VydmVycy5hZGQoc2VydmVyKTsKLQkJCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvQnJlYWtwb2ludERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9CcmVha3BvaW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODU4MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9CcmVha3BvaW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ3VzdG9tIG1lc3NhZ2UgZGlhbG9nIHRoYXQgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgbm90IGluIHRoZSBjb3JyZWN0IGxhdW5jaCBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludERpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBib29sZWFuIHJlbWVtYmVyOwotCi0JcHVibGljIEJyZWFrcG9pbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgbnVsbCwKLQkJCU1lc3NhZ2VzLmRpYWxvZ0JyZWFrcG9pbnRzLCBNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuUFJPQ0VFRF9MQUJFTCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiByZW1lbWJlckIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJcmVtZW1iZXJCLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUmVtZW1iZXIpOwotCQlyZW1lbWJlckIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtZW1iZXIgPSByZW1lbWJlckIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVtZW1iZXJCOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtZW1iZXIoKSB7Ci0JCXJldHVybiByZW1lbWJlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTGF1bmNoV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWU3NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBhY3Rpb24gdGhhdCBvcGVucyB1cCBhIHdvcmtiZW5jaCB3aXphcmQgd2hlbiBydW4uCi0gKi8KLWFic3RyYWN0IGNsYXNzIExhdW5jaFdpemFyZEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JLyoqCi0JICogTGF1bmNoV2l6YXJkQWN0aW9uCi0JICovCi0JcHVibGljIExhdW5jaFdpemFyZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtiZW5jaCB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIHRvIG9wZW4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVdvcmtiZW5jaFdpemFyZCBnZXRXaXphcmQoKTsKLQotCS8qCi0JICogQHNlZSBJQWN0aW9uLnJ1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQllbHNlCi0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQotCQlJV29ya2JlbmNoV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvblRvUGFzcyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MjM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3U2VydmVyV2l6YXJkOwotLyoqCi0gKiBBY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlckFjdGlvbiBleHRlbmRzIE5ld1dpemFyZEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGlkczsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE5ld1NlcnZlckFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJBY3Rpb24gd2l0aCBzb21lIGluaXRpYWwgdGFzayBtb2RlbAotCSAqIHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIGlkcwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyQWN0aW9uKFN0cmluZ1tdIGlkcywgU3RyaW5nW10gdmFsdWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWRzID0gaWRzOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlCi0JICogICBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTmV3U2VydmVyV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCWlmIChpZHMgPT0gbnVsbCkKLQkJCXdpemFyZCA9IG5ldyBOZXdTZXJ2ZXJXaXphcmQoKTsKLQkJZWxzZQotCQkJd2l6YXJkID0gbmV3IE5ld1NlcnZlcldpemFyZChpZHMsIHZhbHVlcyk7Ci0JCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyV2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlcldpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFhMmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3U2VydmVyV2l6YXJkOwotLyoqCi0gKiBBbiBhY3Rpb24gdG8gaW52b2tlIHRoZSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXaXphcmRBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmdbXSBpZHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQotCS8qKgotCSAqIE5ldyBzZXJ2ZXIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCi0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ORVdfU0VSVkVSKSk7Ci0JCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2V0TmV3U2VydmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmV3IHNlcnZlciBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGlkcyBpZHMgdG8gcGFzcyBpbnRvIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyB0byBwYXNzIGludG8gdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oU3RyaW5nW10gaWRzLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJdGhpcygpOwotCQl0aGlzLmlkcyA9IGlkczsKLQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaXphcmQgZ2V0V2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IE5ld1NlcnZlcldpemFyZChpZHMsIHZhbHVlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmMzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0vKioKLSAqIEFjdGlvbiB0byBjcmVhdGUgYSBuZXcgc2VydmVyIGVsZW1lbnQgdGhyb3VnaCBhIHdpemFyZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dpemFyZEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBOZXdXaXphcmRBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTmV3V2l6YXJkQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoaXMgYWN0aW9uIGRlbGVnYXRlLiAgVGhlIGltcGxlbWVudG9yIHNob3VsZCB1bmhvb2sgYW55IHJlZmVyZW5jZXMKLQkgKiB0byBpdHNlbGYgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3Rpb24gY2FuIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KLQkgKgotCSAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl3b3JrYmVuY2ggPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50ZXJzIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBjaGFuZ2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKLQkgKiBhY3Rpb24gb3IgdG8gbW9kaWZ5IG90aGVyIHByZXNlbnRhdGlvbiBwcm9wZXJ0aWVzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBzZWwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJZWxzZQotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcHRpb25zTWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcHRpb25zTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU3N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvT3B0aW9uc01lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDdXN0b20gbWVzc2FnZSBkaWFsb2cgdGhhdCBkaXNwbGF5cyBhIHNldCBvZiBvcHRpb25zLgotICogUmV0dXJuIHZhbHVlIGlzIHRoZSBvcHRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIGludCByYWRpbzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1lbWJlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gb3B0aW9uczsKLQotCXB1YmxpYyBPcHRpb25zTWVzc2FnZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgU3RyaW5nW10gb3B0aW9ucykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgdGl0bGUsIG51bGwsIGRpYWxvZ01lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0JCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0JCWlmIChvcHRpb25zID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG9wdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgLy8gY3JlYXRlIG1lc3NhZ2UgYXJlYQotICAgICAgY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgdG9wIGxldmVsIGNvbXBvc2l0ZSBmb3IgdGhlIGRpYWxvZyBhcmVhCi0gICAgICAvKkNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsqLwotICAgICAgY3JlYXRlQ3VzdG9tQXJlYShwYXJlbnQpOwotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludCBzaXplID0gb3B0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkKLQkJCUJ1dHRvbiByYWRpb0IgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJCXJhZGlvQi5zZXRUZXh0KG9wdGlvbnNbaV0pOwotCQkJZmluYWwgaW50IHggPSBpOwotCQkJcmFkaW9CLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmFkaW8gPSB4OwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGkgPT0gMCkgewotCQkJCXJhZGlvQi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJcmFkaW8gPSAwOwotCQkJfQotCQl9Ci0JCQotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiByZW1lbWJlckIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJcmVtZW1iZXJCLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUmVtZW1iZXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlyZW1lbWJlckIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtZW1iZXJCLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbWVtYmVyID0gcmVtZW1iZXJCLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlbWVtYmVyQjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gMCkKLQkJCXNldFJldHVybkNvZGUocmFkaW8pOwotCQllbHNlCi0JCQlzZXRSZXR1cm5Db2RlKDkpOwotCQljbG9zZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtZW1iZXIoKSB7Ci0JCXJldHVybiByZW1lbWJlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzY0MmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqICJSdW4gb24gU2VydmVyIiBtZW51IGFjdGlvbi4gQWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhbgotICogb2JqZWN0LCBhbmQgaGF2ZSBhdXRvbWF0aWMgc2VydmVyIGNyZWF0aW9uLCBsYXVuY2hpbmcsIGFuZAotICogdGhlIGFwcHJvcHJpYXRlIGNsaWVudCB0byBhcHBlYXIuIEEgbmV3IGluc3RhbmNlIG9mIHRoaXMKLSAqIGFjdGlvbiBtdXN0IGJlIGNyZWF0ZWQgZm9yIGVhY2ggb2JqZWN0IHRoYXQgdGhlIHVzZXIgc2VsZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIFJ1biBvbiBzZXJ2ZXIgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIGRlYnVnCi0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyQWN0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIoTWVzc2FnZXMuYWN0aW9uUnVuT25TZXJ2ZXIpOwotCQotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkKLQkJZGVsZWdhdGUgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KTsKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsKTsKLQkJfSBlbHNlCi0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4MjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTGF1bmNoYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5Nb2R1bGVBcnRpZmFjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLS8qKgotICogU3VwcG9ydCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgc2VydmVyIGFuZCBjbGllbnRzIGZvciByZXNvdXJjZXMgcnVubmluZyBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGF1bmNoTW9kZXMgPSB7Ci0JCUlMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUgfTsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2xvYmFsU2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnbG9iYWxMYXVuY2hNb2RlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFza3NBbmRDbGllbnRTaG93bjsKLQotCXByb3RlY3RlZCBJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXI7Ci0JcHJvdGVjdGVkIElDbGllbnQgY2xpZW50OwotCi0JLyoqCi0JICogUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoaXMgYWN0aW9uIGRlbGVnYXRlLiAgVGhlIGltcGxlbWVudG9yIHNob3VsZCB1bmhvb2sgYW55IHJlZmVyZW5jZXMKLQkgKiB0byBpdHNlbGYgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3Rpb24gY2FuIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdpbmRvdyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgd2l0aCB0aGUgd29ya2JlbmNoIHdpbmRvdyBpdCB3aWxsIHdvcmsgaW4uCi0JICoKLQkgKiBAcGFyYW0gbmV3V2luZG93IHRoZSB3aW5kb3cgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyBuZXdXaW5kb3cpIHsKLQkJd2luZG93ID0gbmV3V2luZG93OwotCX0KLQotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldERlZmF1bHRTZXJ2ZXIobW9kdWxlKTsKLQkJCi0JCS8vIGlnbm9yZSBwcmVmZXJlbmNlIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgbW9kZS4KLQkJaWYgKHNlcnZlciAhPSBudWxsICYmICFTZXJ2ZXJVSVBsdWdpbi5pc0NvbXBhdGlibGVXaXRoTGF1bmNoTW9kZShzZXJ2ZXIsIGxhdW5jaE1vZGUpKQotCQkJc2VydmVyID0gbnVsbDsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiAhU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsIG1vZHVsZSwgbW9uaXRvcikpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJdHJ5IHsKLQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCXdjLnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBhZGQgbW9kdWxlIHRvIHNlcnZlciIsIGNlKTsKLQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlTaGVsbCBzaGVsbDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJZWxzZQotCQkJc2hlbGwgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCS8vIHRyeSB0aGUgZnVsbCB3aXphcmQKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxhdW5jaGluZyB3aXphcmQiKTsKLQkJCVJ1bk9uU2VydmVyV2l6YXJkIHdpemFyZCA9IG5ldyBSdW5PblNlcnZlcldpemFyZChtb2R1bGUsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0KTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7Ci0JCQl9Ci0JCQlzZXJ2ZXIgPSB3aXphcmQuZ2V0U2VydmVyKCk7Ci0JCQlib29sZWFuIHByZWZlcnJlZCA9IHdpemFyZC5pc1ByZWZlcnJlZFNlcnZlcigpOwotCQkJdGFza3NBbmRDbGllbnRTaG93biA9IHRydWU7Ci0JCQljbGllbnQgPSB3aXphcmQuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLQkJCWxhdW5jaGFibGVBZGFwdGVyID0gd2l6YXJkLmdldExhdW5jaGFibGVBZGFwdGVyKCk7Ci0JCQkKLQkJCS8vIHNldCBwcmVmZXJyZWQgc2VydmVyIGlmIHJlcXVlc3RlZAotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHByZWZlcnJlZCkgewotCQkJCXRyeSB7Ci0JCQkJCVNlcnZlckNvcmUuc2V0RGVmYXVsdFNlcnZlcihtb2R1bGUsIHNlcnZlciwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlUHJlZmVyZW5jZTsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBjZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJ1biB0aGUgcmVzb3VyY2Ugb24gYSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotCQlmaW5hbCBJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlQXJ0aWZhY3RzKHNlbGVjdGlvbik7Ci0JCWlmIChtb2R1bGVBcnRpZmFjdHMgPT0gbnVsbCB8fCBtb2R1bGVBcnRpZmFjdHMubGVuZ3RoID09IDAgfHwgbW9kdWxlQXJ0aWZhY3RzWzBdID09IG51bGwpIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vQXJ0aWZhY3QpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTm8gbW9kdWxlIGFydGlmYWN0IGZvdW5kIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVNoZWxsIHNoZWxsMiA9IG51bGw7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXNoZWxsMiA9IHdpbmRvdy5nZXRTaGVsbCgpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJc2hlbGwyID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWlmIChzaGVsbDIgPT0gbnVsbCkKLQkJCQlzaGVsbDIgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQl9Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gc2hlbGwyOwotCQlmaW5hbCBJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJcmV0dXJuIHNoZWxsOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQkKLQkJLy8gZ2V0IGEgdmFsaWQgTW9kdWxlQXJ0aWZhY3QgdGhhdCB3ZSBjYW4gdXNlIGZvciBsYXVuY2hpbmcKLQkJLy8gVE9ETyBUaGUgTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIFJ1bk9uU2VydmVyV2l6YXJkCi0JCWZpbmFsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQkJaWYgKG1vZHVsZUFydGlmYWN0cy5sZW5ndGggPiAxKSB7Ci0JCQlNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZSBhcnRpZmFjdENvbXBvc2l0ZSA9IG5ldyBNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZShzaGVsbCwgbW9kdWxlQXJ0aWZhY3RzLCBsYXVuY2hNb2RlKTsKLQkJCWlmIChhcnRpZmFjdENvbXBvc2l0ZS5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCW1vZHVsZUFydGlmYWN0ID0gYXJ0aWZhY3RDb21wb3NpdGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZQotCQkJbW9kdWxlQXJ0aWZhY3QgPSBtb2R1bGVBcnRpZmFjdHNbMF07Ci0JCQotCQlpZiAobW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkgPT0gbnVsbCkgeyAvLyAxNDk0MjUKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vTW9kdWxlcyk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJNb2R1bGUgYXJ0aWZhY3Qgbm90IGNvbnRhaW5lZCBpbiBhIG1vZHVsZSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIElNb2R1bGUgbW9kdWxlID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCk7Ci0JCQotCQkvLyBjaGVjayBmb3Igc2VydmVycyB3aXRoIHRoZSBnaXZlbiBzdGFydCBtb2RlCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiAhZm91bmQ7IGkrKykgewotCQkJCWlmIChTZXJ2ZXJVSVBsdWdpbi5pc0NvbXBhdGlibGVXaXRoTGF1bmNoTW9kZShzZXJ2ZXJzW2ldLCBsYXVuY2hNb2RlKSkgewotCQkJCQl0cnkgewotCQkJCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXJzW2ldLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7Ci0JCQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFmb3VuZCkgewotCQkJLy8gbm8gZXhpc3Rpbmcgc2VydmVyIHN1cHBvcnRzIHRoZSBwcm9qZWN0IGFuZCBzdGFydCBtb2RlIQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgbWlnaHQgYmUgYW5vdGhlciBvbmUgdGhhdCBjYW4gYmUgY3JlYXRlZAotCQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJCWlmIChzZXJ2ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmICFmb3VuZDsgaSsrKSB7Ci0JCQkJCUlTZXJ2ZXJUeXBlIHR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKLQkJCQkJSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcyA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpOwotCQkJCQlpZiAodHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZSkgJiYgU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSkpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMuZXJyb3JOb1NlcnZlcik7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTm8gc2VydmVyIGZvciBzdGFydCBtb2RlIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQl0YXNrc0FuZENsaWVudFNob3duID0gZmFsc2U7Ci0JCUlTZXJ2ZXIgc2VydmVyMiA9IG51bGw7Ci0JCWNsaWVudCA9IG51bGw7Ci0JCWxhdW5jaGFibGVBZGFwdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQlzZXJ2ZXIyID0gZ2V0U2VydmVyKG1vZHVsZSwgbW9kdWxlQXJ0aWZhY3QsIG1vbml0b3IpOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKHNlcnZlcjIgIT0gbnVsbCkgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gc2VydmVyMi5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGZvbGRlci5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhZm9sZGVyLmdldFByb2plY3QoKS5pc09wZW4oKSkKLQkJCQkJZm9sZGVyLmdldFByb2plY3QoKS5vcGVuKG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3Ioc2hlbGwsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIgPSBzZXJ2ZXIyOwotCQkvL2lmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJLy8JcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU2VydmVyOiAiICsgc2VydmVyKTsKLQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXIpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiTm8gc2VydmVyIGZvdW5kIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmICghdGFza3NBbmRDbGllbnRTaG93bikgewotCQkJUnVuT25TZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IFJ1bk9uU2VydmVyV2l6YXJkKHNlcnZlciwgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJaWYgKHdpemFyZC5zaG91bGRBcHBlYXIoKSkgewotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZQotCQkJCXdpemFyZC5wZXJmb3JtRmluaXNoKCk7Ci0JCQljbGllbnQgPSB3aXphcmQuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLQkJCWxhdW5jaGFibGVBZGFwdGVyID0gd2l6YXJkLmdldExhdW5jaGFibGVBZGFwdGVyKCk7Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZXJlIGlzIG5vIGNsaWVudCwgdXNlIGEgZHVtbXkKLQkJaWYgKGNsaWVudCA9PSBudWxsKSB7CQkKLQkJCWNsaWVudCA9IG5ldyBJQ2xpZW50KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0RGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmNsaWVudC5kZWZhdWx0IjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0TmFtZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMywgSUxhdW5jaCBsYXVuY2gpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMykgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlpZiAobW9kdWxlQXJ0aWZhY3QgaW5zdGFuY2VvZiBNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSB7Ci0JCQlib29sZWFuIGNhbkxvYWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUobW9kdWxlQXJ0aWZhY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCWlmIChjLm5ld0luc3RhbmNlKCkgIT0gbnVsbCkKLQkJCQkJY2FuTG9hZCA9IHRydWU7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb2R1bGUgYXJ0aWZhY3QgZGVsZWdhdGUgY2xhc3MsIHN3aXRjaGluZyB0byBiYWNrdXAiKTsKLQkJCX0KLQkJCWlmIChjYW5Mb2FkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihzZXJ2ZXIsIChNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCwgbW9uaXRvcik7Ci0JCQkJCWNvbmZpZy5sYXVuY2gobGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbGF1bmNoIFJ1biBvbiBTZXJ2ZXIiLCBjZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIlJ1biBvbiBTZXJ2ZXIiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUmVhZHkgdG8gbGF1bmNoIik7Ci0JCQkJCi0JCQkJLy8gc3RhcnQgc2VydmVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZAotCQkJCS8vIGFuZCBjdWUgdGhlIGNsaWVudCB0byBzdGFydAotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9OyAvLyBUT0RPOiBnZXQgcGFyZW50IGhpZXJhcmNoeSBjb3JyZWN0Ci0JCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpIHsKLQkJCQkJTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7Ci0JCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdGFydCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQkJCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQkJCQlib29sZWFuIGRpc2FibGVkQnJlYWtwb2ludHMgPSBmYWxzZTsKLQkJCQkJCi0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpIHsKLQkJCQkJCWludCByZXN1bHQgPSBvcGVuUmVzdGFydERpYWxvZyhzaGVsbCk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDkpIC8vIGNhbmNlbAotCQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoIXJlc3RhcnQpIHsKLQkJCQkJCWlmICghSUxhdW5jaE1hbmFnZXIuUlVOX01PREUuZXF1YWxzKG1vZGUpICYmIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQkJCWJvb2xlYW4gYnJlYWtwb2ludHNPcHRpb24gPSBmYWxzZTsKLQkJCQkJCQlpZiAoYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJCQkJCWJyZWFrcG9pbnRzT3B0aW9uID0gdHJ1ZTsKLQkJCQkJCQlpbnQgcmVzdWx0ID0gb3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpelJ1bk9uU2VydmVyVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUnVuLCBicmVha3BvaW50c09wdGlvbik7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJZGlzYWJsZWRCcmVha3BvaW50cyA9IHRydWU7Ci0JCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDIpCi0JCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQkJCWVsc2UgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSBpZiAoIUlMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpICYmIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQkJCQkJaW50IHJlc3VsdCA9IG9wZW5PcHRpb25zRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy53aXpEZWJ1Z09uU2VydmVyVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nRGVidWcsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQkJCXJlc3RhcnQgPSB0cnVlOwotCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQotCQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQllbHNlIC8vIHJlc3VsdCA9PSA5IC8vIGNhbmNlbAotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgaWYgKCFJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpICYmIElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJCQlib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uID0gZmFsc2U7Ci0JCQkJCQkJaWYgKGJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCQkJCQlicmVha3BvaW50c09wdGlvbiA9IHRydWU7Ci0JCQkJCQkJaW50IHJlc3VsdCA9IG9wZW5PcHRpb25zRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy53aXpQcm9maWxlT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdQcm9maWxlLCBicmVha3BvaW50c09wdGlvbik7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJZGlzYWJsZWRCcmVha3BvaW50cyA9IHRydWU7Ci0JCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDIpCi0JCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQkJCWVsc2UgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQkJCQkJaWYgKCFicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiAhZGlzYWJsZWRCcmVha3BvaW50cykgewotCQkJCQkJCQlpbnQgcmVzdWx0ID0gb3BlbkJyZWFrcG9pbnREaWFsb2coc2hlbGwpOwotCQkJCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJCX0gZWxzZSAvLyByZXN1bHQgPT0gMgotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJZmluYWwgTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7Ci0JCQkJCWlmIChyZXN0YXJ0KSB7Ci0JCQkJCQlmaW5hbCBJU2VydmVyIHNlcnZlcjMgPSBzZXJ2ZXI7Ci0JCQkJCQlzZXJ2ZXIucmVzdGFydChsYXVuY2hNb2RlLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQkJCQlzZXJ2ZXIzLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0MikgewotCQkJCQkJCQkJCWlmIChyZXN1bHQyLmlzT0soKSkKLQkJCQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKLQkJCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQkJCWZpbmFsIExhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOwotCQkJCQkKLQkJCQkJc2VydmVyLnN0YXJ0KGxhdW5jaE1vZGUsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKLQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBJU2VydmVyIHNlcnZlciwgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJQ2xpZW50IGNsaWVudCkgewotCQlTdHJpbmcgbGF1bmNoTmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJ1bk9uU2VydmVyTGF1bmNoQ29uZmlnTmFtZSwgbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpKTsKLQkJbGF1bmNoTmFtZSA9IGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUobGF1bmNoTmFtZSk7Ci0JCWlmICghbGF1bmNoTmFtZS5lcXVhbHMoY29uZmlnLmdldE5hbWUoKSkpIHsKLQkJCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7Ci0JCQljb25maWcucmVuYW1lKGxhdW5jaE5hbWUpOwotCQl9Ci0JCQotCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXIuZ2V0SWQoKSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9NT0RVTEVfQVJUSUZBQ1QsIG1vZHVsZUFydGlmYWN0LnNlcmlhbGl6ZSgpKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUywgbW9kdWxlQXJ0aWZhY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlpZiAobGF1bmNoYWJsZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9MQVVOQ0hBQkxFX0FEQVBURVJfSUQsIGxhdW5jaGFibGVBZGFwdGVyLmdldElkKCkpOwotCQllbHNlCi0JCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfTEFVTkNIQUJMRV9BREFQVEVSX0lELCAoU3RyaW5nKW51bGwpOwotCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfQ0xJRU5UX0lELCBjbGllbnQuZ2V0SWQoKSk7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpLmdldFByb2plY3QoKTsKLQkJCWNvbmZpZy5zZXRNYXBwZWRSZXNvdXJjZXMobmV3IElSZXNvdXJjZVtdIHsgcHJvamVjdCB9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgYXNzb2NpYXRlIGxhdW5jaCB3aXRoIGEgcHJvamVjdCIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oSVNlcnZlciBzZXJ2ZXIsIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgbW9kdWxlQXJ0aWZhY3QsIElMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlcjIsIElDbGllbnQgY2xpZW50MiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGxhdW5jaENvbmZpZ1R5cGUgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIik7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uW10gbGF1bmNoQ29uZmlncyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsYXVuY2hDb25maWdzID0gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyhsYXVuY2hDb25maWdUeXBlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJaWYgKGxhdW5jaENvbmZpZ3MgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBsYXVuY2hDb25maWdzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTGlzdCBsaXN0ID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9GQVZPUklURV9HUk9VUFMsIChMaXN0KW51bGwpOwotCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBzZXJ2ZXJJZDIgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JCQkJCQlpZiAoc2VydmVySWQuZXF1YWxzKHNlcnZlcklkMikpIHsKLQkJCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRXb3JraW5nQ29weSgpOwotCQkJCQkJCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3Yywgc2VydmVyLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIyLCBjbGllbnQyKTsKLQkJCQkJCQlpZiAod2MuaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlyZXR1cm4gd2MuZG9TYXZlKCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvbmZpZ3VyaW5nIGxhdW5jaCIsIGNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbGF1bmNoQ29uZmlnc1tpXTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBsYXVuY2hOYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMucnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lLCBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkpOwotCQlsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShsYXVuY2hOYW1lKTsKLQkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7IAotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLCBsYXVuY2hOYW1lKTsKLQkJd2Muc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXJJZCk7Ci0JCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3Yywgc2VydmVyLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIyLCBjbGllbnQyKTsKLQkJcmV0dXJuIHdjLmRvU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfQ0hBUlMgPSBuZXcgY2hhcltdIHsnXFwnLCAnOicsICcqJywgJz8nLCAnIicsICc8JywgJz4nLCAnfCcsICdcMCcsICdAJywgJyYnfTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIjEiOwotCQlpbnQgc2l6ZSA9IElOVkFMSURfQ0hBUlMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcyA9IHMucmVwbGFjZShJTlZBTElEX0NIQVJTW2ldLCAnXycpOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gb3B0aW9ucyBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gYnJlYWtwb2ludHNPcHRpb24KLQkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5PcHRpb25zRGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uKSB7Ci0JCWlmIChicmVha3BvaW50c09wdGlvbikgewotCQkJaW50IGN1cnJlbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldExhdW5jaE1vZGUyKCk7Ci0JCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9SRVNUQVJUKQotCQkJCXJldHVybiAwOwotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9ESVNBQkxFX0JSRUFLUE9JTlRTKQotCQkJCXJldHVybiAxOwotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9DT05USU5VRSkKLQkJCQlyZXR1cm4gMjsKLQkJfSBlbHNlIHsKLQkJCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRMYXVuY2hNb2RlKCk7Ci0JCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQpCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlIGlmIChjdXJyZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07Ci0JCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT3B0aW9uc01lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQkJCQlTdHJpbmdbXSBpdGVtcyA9IG51bGw7Ci0JCQkJaWYgKGJyZWFrcG9pbnRzT3B0aW9uKSB7Ci0JCQkJCWl0ZW1zID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydCwKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQnJlYWtwb2ludHMsCi0JCQkJCQlNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlCi0JCQkJCX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXRlbXMgPSBuZXcgU3RyaW5nW10gewotCQkJCQkJTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdSZXN0YXJ0LAotCQkJCQkJTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdDb250aW51ZQotCQkJCQl9OwotCQkJCX0KLQkJCQkKLQkJCQlkaWFsb2cgPSBuZXcgT3B0aW9uc01lc3NhZ2VEaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBpdGVtcyk7Ci0JCQkJaVswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCi0JCQkJaWYgKGRpYWxvZy5pc1JlbWVtYmVyKCkpIHsKLQkJCQkJaWYgKGJyZWFrcG9pbnRzT3B0aW9uKSB7Ci0JCQkJCQlpZiAoaVswXSA9PSAwKQotCQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0TGF1bmNoTW9kZTIoU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCk7Ci0JCQkJCQllbHNlIGlmIChpWzBdID09IDEpCi0JCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlMihTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9ESVNBQkxFX0JSRUFLUE9JTlRTKTsKLQkJCQkJCWVsc2UgaWYgKGlbMF0gPT0gMikKLQkJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldExhdW5jaE1vZGUyKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0NPTlRJTlVFKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChpWzBdID09IDApCi0JCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfUkVTVEFSVCk7Ci0JCQkJCQllbHNlIGlmIChpWzBdID09IDEpCi0JCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGlbMF07Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBvcHRpb25zIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5CcmVha3BvaW50RGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRFbmFibGVCcmVha3BvaW50cygpOwotCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19ORVZFUikKLQkJCXJldHVybiAxOwotCQkKLQkJZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07Ci0JCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT3B0aW9uc01lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE9wdGlvbnNNZXNzYWdlRGlhbG9nKHNoZWxsLAotCQkJCQkJTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dCcmVha3BvaW50cywgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ0JyZWFrcG9pbnRzUmVlbmFibGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQ29udGludWV9KTsKLQkJCQlpWzBdID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGlhbG9nLmlzUmVtZW1iZXIoKSkgewotCQkJCQlpZiAoaVswXSA9PSAwKQotCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRFbmFibGVCcmVha3BvaW50cyhTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMpOwotCQkJCQllbHNlIGlmIChpWzBdID09IDEpCi0JCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldEVuYWJsZUJyZWFrcG9pbnRzKFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaVswXTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgcmVzdGFydCBvcHRpb25zIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5SZXN0YXJ0RGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRSZXN0YXJ0KCk7Ci0JCWlmIChjdXJyZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfTkVWRVIpCi0JCQlyZXR1cm4gMTsKLQkJCi0JCWZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOwotCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9wdGlvbnNNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBPcHRpb25zTWVzc2FnZURpYWxvZyhzaGVsbCwKLQkJCQkJCU1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMuZGlhbG9nUmVzdGFydCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ1Jlc3RhcnRSZXN0YXJ0LCBNZXNzYWdlcy5kaWFsb2dSZXN0YXJ0Q29udGludWV9KTsKLQkJCQlpWzBdID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGlhbG9nLmlzUmVtZW1iZXIoKSkgewotCQkJCQlpZiAoaVswXSA9PSAwKQotCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRSZXN0YXJ0KFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpOwotCQkJCQllbHNlIGlmIChpWzBdID09IDEpCi0JCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldFJlc3RhcnQoU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaVswXTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gcGVyZm9ybWVkLiBJbXBsZW1lbnQKLQkgKiB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCi0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbgotCSAqIHBvcnRpb24gb2YgdGhlIHBsdWdpbiBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUnVubmluZyBvbiBTZXJ2ZXIuLi4iKTsKLQkJdHJ5IHsKLQkJCXJ1bigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiUnVuIG9uIFNlcnZlciBFcnJvciIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQl0cnkgewotCQkJQm9vbGVhbiBiID0gZ2xvYmFsTGF1bmNoTW9kZS5nZXQoZ2V0TGF1bmNoTW9kZSgpKTsKLQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG1vZGUgdGhhdCB0aGUgc2VydmVyIHNob3VsZCB1c2UuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hNb2RlKCkgewotCQlyZXR1cm4gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxhdW5jaCBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEge0BsaW5rIElMYXVuY2hNYW5hZ2VyfSBsYXVuY2ggbW9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaE1vZGUoU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hpY2ggY2xpZW50cyBjYW4gYWN0IG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24KLQkgKiAgICBwb3J0aW9uIG9mIHRoZSBwbHVnaW4gYWN0aW9uCi0JICogQHBhcmFtIHNlbCBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIj4gc2VsZWN0aW9uQ2hhbmdlZCIpOwotCQlzZWxlY3Rpb24gPSBudWxsOwotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5pc0VtcHR5KCkgfHwgIShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdC5pdGVyYXRvcigpOwotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJc2VsZWN0aW9uID0gaXRlcmF0b3IubmV4dCgpOwotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7IC8vIG1vcmUgdGhhbiBvbmUgc2VsZWN0aW9uIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gZ2xvYmFsU2VsZWN0aW9uKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24pOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZWxlY3Rpb24gdHlwZTogIiArIHNlbGVjdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlnbG9iYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQlnbG9iYWxMYXVuY2hNb2RlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwotCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZ2xvYmFsU2VsZWN0aW9uKSkgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImNoZWNraW5nIGZvciBtb2R1bGUgYXJ0aWZhY3QiKTsKLQkJCS8vIFRPRE8gLSBtdWx0aXBsZSBtb2R1bGUgYXJ0aWZhY3RzCi0JCQlJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlQXJ0aWZhY3RzKGdsb2JhbFNlbGVjdGlvbik7Ci0JCQlJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QgPSBudWxsOwotCQkJaWYgKG1vZHVsZUFydGlmYWN0cyAhPSBudWxsKQotCQkJCW1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3RzWzBdOwotCQkJCi0JCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgIT0gbnVsbCkKLQkJCQltb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIm1vZHVsZUFydGlmYWN0PSAiICsgbW9kdWxlQXJ0aWZhY3QgKyAiLCBtb2R1bGU9ICIgKyBtb2R1bGUpOwotCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCWZpbmRHbG9iYWxMYXVuY2hNb2Rlcyhtb2R1bGUpOwotCQkJZWxzZSB7Ci0JCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBzZWxlY3Rpb25DaGFuZ2VkICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2VydmVyIGZhY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlCi0JICogYW5kIHRoZSB2YXJpb3VzIHN0YXJ0IG1vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRHbG9iYWxMYXVuY2hNb2RlcyhJTW9kdWxlIG1vZHVsZSkgewotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXJUeXBlIHR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKLQkJCQlpZiAoaXNWYWxpZFNlcnZlclR5cGUodHlwZSwgbW9kdWxlKSkgewotCQkJCQlmb3IgKGJ5dGUgYiA9IDA7IGIgPCBsYXVuY2hNb2Rlcy5sZW5ndGg7IGIrKykgewotCQkJCQkJaWYgKHR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGVzW2JdKSkgewotCQkJCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KGxhdW5jaE1vZGVzW2JdLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIGNhbiBsYXVuY2ggdGhlIG1vZHVsZS4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNlcnZlclR5cGUoSVNlcnZlclR5cGUgdHlwZSwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwMWFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTGF1bmNoYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTGF1bmNoQ2xpZW50Sm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotCi1wdWJsaWMgY2xhc3MgUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VSVkVSX0lEID0gInNlcnZlci1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NT0RVTEVfQVJUSUZBQ1QgPSAibW9kdWxlLWFydGlmYWN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUyA9ICJtb2R1bGUtYXJ0aWZhY3QtY2xhc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVVOQ0hBQkxFX0FEQVBURVJfSUQgPSAibGF1bmNoYWJsZS1hZGFwdGVyLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMSUVOVF9JRCA9ICJjbGllbnQtaWQiOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUJlZm9yZUxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGlnbm9yZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIGxhdW5jaE1vZGUsIGZpbmFsIElMYXVuY2ggbGF1bmNoMiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIHNlcnZlcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9TRVJWRVJfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCVN0cmluZyBtb2R1bGVBcnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX01PRFVMRV9BUlRJRkFDVCwgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIG1vZHVsZUFydGlmYWN0Q2xhc3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUywgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIGxhSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0xBVU5DSEFCTEVfQURBUFRFUl9JRCwgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIGNsaWVudElkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9DTElFTlRfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCA9IG51bGw7Ci0JCUlMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlciA9IG51bGw7Ci0JCWlmIChsYUlkICE9IG51bGwpCi0JCQlsYXVuY2hhYmxlQWRhcHRlciA9IFNlcnZlclBsdWdpbi5maW5kTGF1bmNoYWJsZUFkYXB0ZXIobGFJZCk7Ci0JCUlDbGllbnQgY2xpZW50ID0gU2VydmVyUGx1Z2luLmZpbmRDbGllbnQoY2xpZW50SWQpOwotCQkKLQkJdHJ5IHsKLQkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKG1vZHVsZUFydGlmYWN0Q2xhc3MpOwotCQkJbW9kdWxlQXJ0aWZhY3QgPSAoTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSkgYy5uZXdJbnN0YW5jZSgpOwotCQkJbW9kdWxlQXJ0aWZhY3QuZGVzZXJpYWxpemUobW9kdWxlQXJ0KTsKLQkJCW1vZHVsZSA9IG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBhcnRpZmFjdCBkZWxlZ2F0ZSBjbGFzcyIpOwotCQl9Ci0JCQotCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckxhdW5jaENvbmZpZykpOwotCQkKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yTGF1bmNoQ29uZmlnKSk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkU2VydmVyKSk7Ci0JCQotCQlpZiAobGF1bmNoYWJsZUFkYXB0ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckxhdW5jaENvbmZpZykpOwotCQkKLQkJZmluYWwgU2hlbGxbXSBzaGVsbDIgPSBuZXcgU2hlbGxbMV07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaGVsbDJbMF0gPSBFY2xpcHNlVXRpbC5nZXRTaGVsbCgpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBzaGVsbDJbMF07Ci0JCWZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCQotCQlpZiAoY2xpZW50ID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vIGNsaWVudCwgdXNlIGEgZHVtbXkKLQkJCWNsaWVudCA9IG5ldyBJQ2xpZW50KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0RGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmNsaWVudC5kZWZhdWx0IjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0TmFtZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMywgSUxhdW5jaCBsYXVuY2gpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMykgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZWFkeSB0byBsYXVuY2giKTsKLQkJbGF1bmNoMi5hZGRQcm9jZXNzKG5ldyBSdW5PblNlcnZlclByb2Nlc3MobGF1bmNoMikpOwotCQkKLQkJLy8gc3RhcnQgc2VydmVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZAotCQkvLyBhbmQgY3VlIHRoZSBjbGllbnQgdG8gc3RhcnQKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07IC8vIFRPRE86IGdldCBwYXJlbnQgaGllcmFyY2h5IGNvcnJlY3QKLQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKLQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJCWJvb2xlYW4gZGlzYWJsZWRCcmVha3BvaW50cyA9IGZhbHNlOwotCQkJCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSB7IC8vIFRPRE8gLSByZXN0YXJ0IHN0YXRlIG1pZ2h0IG5vdCBiZSBzZXQgdW50aWwgYWZ0ZXIgcHVibGlzaAotCQkJCWludCByZXN1bHQgPSBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLm9wZW5SZXN0YXJ0RGlhbG9nKHNoZWxsKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCXJlc3RhcnQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDkpIHsgLy8gY2FuY2VsCi0JCQkJCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXJlc3RhcnQpIHsKLQkJCQlpZiAoIUlMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJYm9vbGVhbiBicmVha3BvaW50c09wdGlvbiA9IGZhbHNlOwotCQkJCQlpZiAoYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJCQlicmVha3BvaW50c09wdGlvbiA9IHRydWU7Ci0JCQkJCWludCByZXN1bHQgPSBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLm9wZW5PcHRpb25zRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1J1biwgYnJlYWtwb2ludHNPcHRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGlzYWJsZWRCcmVha3BvaW50cyA9IHRydWU7Ci0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMikKLQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQllbHNlIHsgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdEZWJ1ZywgZmFsc2UpOwotCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCi0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJZWxzZSB7IC8vIHJlc3VsdCA9PSA5IC8vIGNhbmNlbAotCQkJCQkJbGF1bmNoMi50ZXJtaW5hdGUoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIUlMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQlib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uID0gZmFsc2U7Ci0JCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQkJCWJyZWFrcG9pbnRzT3B0aW9uID0gdHJ1ZTsKLQkJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGUsIGJyZWFrcG9pbnRzT3B0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJcmVzdGFydCA9IHRydWU7Ci0JCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWRpc2FibGVkQnJlYWtwb2ludHMgPSB0cnVlOwotCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDIpCi0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJZWxzZSB7Ly8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmICFkaXNhYmxlZEJyZWFrcG9pbnRzKSB7Ci0JCQkJCQlpbnQgcmVzdWx0ID0gUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5vcGVuQnJlYWtwb2ludERpYWxvZyhzaGVsbCk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9IGVsc2UgeyAvLyByZXN1bHQgPT0gMgotCQkJCQkJCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmaW5hbCBMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKLQkJCWlmIChyZXN0YXJ0KSB7Ci0JCQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIyID0gc2VydmVyOwotCQkJCXNlcnZlci5yZXN0YXJ0KGxhdW5jaE1vZGUsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQkJc2VydmVyMi5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQyKSB7Ci0JCQkJCQkJCWlmIChyZXN1bHQyLmlzT0soKSkKLQkJCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKLQkJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCWZpbmFsIExhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOwotCQkJCi0JCQkvKkNoYWluZWRKb2IgbXlKb2IgPSBuZXcgQ2hhaW5lZEpvYigidGVzdCIsIHNlcnZlcikgewotCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlMYXVuY2hDb25maWd1cmF0aW9uTWFuYWdlciBsY20gPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQkJCQkJbGNtLnNldFJlY2VudExhdW5jaChsYXVuY2gyKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdHdlYWsgZGVidWcgbGF1bmNoIGhpc3RvcnkiKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OyovCi0JCQkKLQkJCXNlcnZlci5zdGFydChsYXVuY2hNb2RlLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKLQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJQcm9jZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc2Y2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIER1bW15IElQcm9jZXNzIHNvIHRoYXQgYSBSdW4gb24gU2VydmVyIGxhdW5jaCBjYW4gYmUgdGVybWluYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyUHJvY2VzcyBpbXBsZW1lbnRzIElQcm9jZXNzIHsKLQlwcm90ZWN0ZWQgSUxhdW5jaCBsYXVuY2g7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXJtaW5hdGVkOwotCi0JcHVibGljIFJ1bk9uU2VydmVyUHJvY2VzcyhJTGF1bmNoIGxhdW5jaCkgewotCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXJnMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5wcm9jZXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiBsYXVuY2g7Ci0JfQotCi0JcHVibGljIElTdHJlYW1zUHJveHkgZ2V0U3RyZWFtc1Byb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhcmcwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkgewotCQlyZXR1cm4gaXNUZXJtaW5hdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlzVGVybWluYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3NzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLS8qKgotICogQXVkaW8gaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBhdWRpbyBwbHVnaW4uPHA+Ci0gKgotICogQWRkaW5nIGEgbmV3IHNvdW5kIHRvIHlvdXIgcGx1Z2luIGlzIGFzIGVhc3kgYXMgQUJDOgotICogPHVsPgotICogPGxpPkE6IEFkZCB0aGUgZm9sbG93aW5nIHJlcXVpcmVzIHRvIHlvdXIgcGx1Z2luLnhtbDo8YnI+Ci0gKiAgIDxwcmU+Jmx0O2ltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbCImZ3Q7PC9wcmU+PC9saT4KLSAqCi0gKiA8bGk+QjogRGVmaW5lIGEgbmV3IHNvdW5kIGV4dGVuc2lvbiBwb2ludCBpbiB5b3VyIHBsdWdpbi54bWw6PGJyPgotICogICA8cHJlPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbC5zb3VuZCImZ3Q7Ci0gKiAgICAgJmx0O2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9Ik15IFBsdWdpbiBOYW1lIi8mZ3Q7Ci0gKiAgICAgJmx0O3NvdW5kIGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbi5teVNvdW5kIgotICogICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm15UGx1Z2luIgotICogICAgICAgbmFtZT0iU29tZXRoaW5nIEhhcHBlbmVkIgotICogICAgICAgbG9jYXRpb249InNvdW5kcy9teVNvdW5kLndhdiIvJmd0OwotICogICAgICZsdDtzb3VuZCBpZD0ib3JnLmVjbGlwc2UubXlQbHVnaW4ubXlPdGhlclNvdW5kcyIKLSAqICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9IkFub3RoZXIgRXZlbnQgSGFwcGVuZWQiLyZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+PGJyPgotICogICAodGhlIGxvY2F0aW9uIGlzIG9wdGlvbmFsLiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc291bmQKLSAqICAgIHdpbGwgbm90IHBsYXkgdW50aWwgdGhlIHVzZXIgc3BlY2lmaWVzIGFuIGF1ZGlvIGZpbGUpPC9saT4KLSAqCi0gKiA8bGk+QzogQ2FsbCB0aGUgc291bmRzIHdoZW4gdGhlIGFwcHJvcHJpYXRlIGV2ZW50cyBvY2N1ciB3aXRoaW4KLSAqICAgeW91ciBwbHVnaW46PGJyPgotICogICA8cHJlPm9yZy5lY2xpcHNlLndzdC5hdWRpby5BdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLm15UGx1Z2luLm15U291bmQiKTs8L3ByZT48L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEF1ZGlvIHsKLQkvKioKLQkgKiBBdWRpb0NvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEF1ZGlvKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFBsYXlzIHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXlTb3VuZChTdHJpbmcgaWQpIHsKLQkJQXVkaW9Db3JlLmdldEluc3RhbmNlKCkucGxheVNvdW5kKGlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9Db3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0ZTA4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogTWFpbiBhdWRpbyBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdWRpb0NvcmUgewotCXByb3RlY3RlZCBzdGF0aWMgQXVkaW9Db3JlIGluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TT1VORF9FTkFCTEVEID0gInNvdW5kRW5hYmxlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9WT0xVTUUgPSAidm9sdW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVU5EU19GSUxFID0gInNvdW5kcy54bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0ZJTEUgPSAiZGlzYWJsZWQtc291bmRzLnhtbCI7Ci0KLQkvLyBDYXRlZ29yaWVzIC0gbWFwIG9mIFN0cmluZyBpZCB0byBTdHJpbmcgbmFtZXMKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllczsKLQotCS8vIFNvdW5kcyAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gU291bmQKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNvdW5kPiBzb3VuZHM7Ci0KLQkvLyBzcGVjaWZpYyBzb3VuZHMgb3IgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCwgYnkgaWQKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkaXNhYmxlZFNvdW5kczsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkaXNhYmxlZENhdGVnb3JpZXM7Ci0KLQkvLyBTb3VuZE1hcCAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gYW4gSVBhdGgKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElQYXRoPiB1c2VyU291bmRNYXA7Ci0KLQkvKioKLQkgKiBBdWRpb0NvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEF1ZGlvQ29yZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJbG9hZEV4dGVuc2lvblBvaW50cygpOwotCQotCQlsb2FkU291bmRNYXAoKTsKLQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkJCi0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2F0ZWdvcmllcwotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXVkaW8gY2xpcC4KLQkgKgotCSAqIEBwYXJhbSB1cmwgamF2YS5uZXQuVVJMCi0JICogQHJldHVybiBqYXZheC5zb3VuZC5zYW1wbGVkLkNsaXAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENsaXAgZ2V0Q2xpcChVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlBdWRpb0lucHV0U3RyZWFtIGF1ZGlvSW5wdXRTdHJlYW0gPSBBdWRpb1N5c3RlbS5nZXRBdWRpb0lucHV0U3RyZWFtKHVybCk7Ci0JCi0JCQlBdWRpb0Zvcm1hdCBmb3JtYXQgPSBhdWRpb0lucHV0U3RyZWFtLmdldEZvcm1hdCgpOwotCQotCQkJLyoqCi0JCQkgKiB3ZSBjYW4ndCB5ZXQgb3BlbiB0aGUgZGV2aWNlIGZvciBBTEFXL1VMQVcgcGxheWJhY2ssCi0JCQkgKiBjb252ZXJ0IEFMQVcvVUxBVyB0byBQQ00KLQkJCSAqLwotCQkJaWYgKChmb3JtYXQuZ2V0RW5jb2RpbmcoKSA9PSBBdWRpb0Zvcm1hdC5FbmNvZGluZy5VTEFXKSB8fAotCQkJCShmb3JtYXQuZ2V0RW5jb2RpbmcoKSA9PSBBdWRpb0Zvcm1hdC5FbmNvZGluZy5BTEFXKSkgewotCQkJCUF1ZGlvRm9ybWF0IHRtcCA9IG5ldyBBdWRpb0Zvcm1hdCgKLQkJCQkJQXVkaW9Gb3JtYXQuRW5jb2RpbmcuUENNX1NJR05FRCwgCi0JCQkJCWZvcm1hdC5nZXRTYW1wbGVSYXRlKCksCi0JCQkJCWZvcm1hdC5nZXRTYW1wbGVTaXplSW5CaXRzKCkgKiAyLAotCQkJCQlmb3JtYXQuZ2V0Q2hhbm5lbHMoKSwKLQkJCQkJZm9ybWF0LmdldEZyYW1lU2l6ZSgpICogMiwKLQkJCQkJZm9ybWF0LmdldEZyYW1lUmF0ZSgpLCB0cnVlKTsKLQkJCQlhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbSh0bXAsIGF1ZGlvSW5wdXRTdHJlYW0pOwotCQkJCWZvcm1hdCA9IHRtcDsKLQkJCX0KLQkJCURhdGFMaW5lLkluZm8gaW5mbyA9IG5ldyBEYXRhTGluZS5JbmZvKAotCQkJCUNsaXAuY2xhc3MsIGF1ZGlvSW5wdXRTdHJlYW0uZ2V0Rm9ybWF0KCksIAotCQkJCSgoaW50KSBhdWRpb0lucHV0U3RyZWFtLmdldEZyYW1lTGVuZ3RoKCkgKgotCQkJCWZvcm1hdC5nZXRGcmFtZVNpemUoKSkpOwotCQkKLQkJCUNsaXAgY2xpcCA9IChDbGlwKSBBdWRpb1N5c3RlbS5nZXRMaW5lKGluZm8pOwotCQkJY2xpcC5vcGVuKGF1ZGlvSW5wdXRTdHJlYW0pOwotCQkJcmV0dXJuIGNsaXA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IGNsaXA6ICIgKyB1cmwsIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXVkaW8gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvU3VwcG9ydGVkKCkgewotCQl0cnkgewotCQkJYm9vbGVhbiBzb3VuZCA9IGZhbHNlOwotCQkJTWl4ZXIuSW5mb1tdIGluZm8yID0gQXVkaW9TeXN0ZW0uZ2V0TWl4ZXJJbmZvKCk7Ci0JCQlpZiAoaW5mbzIgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gaW5mbzIubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCS8vVHJhY2UudHJhY2UoIiAiICsgaW5mbzJbaV0pOwotCQkJCQlNaXhlciBtaXhlciA9IEF1ZGlvU3lzdGVtLmdldE1peGVyKGluZm8yW2ldKTsKLQkJCQkJaWYgKG1peGVyICE9IG51bGwpIHsKLQkJCQkJCS8vVHJhY2UudHJhY2UoIiAgIE1peGVyOiIgKyBtaXhlcik7Ci0JCQkJCQkvL1RyYWNlLnRyYWNlKCIgICAiICsgbWl4ZXIuZ2V0TGluZUluZm8oKSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUxpbmUuSW5mbyBpbmZvID0gbWl4ZXIuZ2V0TGluZUluZm8oKTsKLQkJCQkJCQlMaW5lIGxpbmUgPSBtaXhlci5nZXRMaW5lKGluZm8pOwotCQkJCQkJCS8vVHJhY2UudHJhY2UoIiAgIExpbmU6IiArIGxpbmUpOwotCQkJCQkJCWlmIChsaW5lICE9IG51bGwgJiYgbGluZS50b1N0cmluZygpLmluZGV4T2YoIk91dHB1dCIpID49IDApCi0JCQkJCQkJCXNvdW5kID0gdHJ1ZTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc291bmQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgdmVyaWZ5IGF1ZGlvIHN0YXR1cyIsIGUpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc291bmQgaXMgZW5hYmxlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRTb3VuZHNFbmFibGVkKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRl9TT1VORF9FTkFCTEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZvbHVtZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0Vm9sdW1lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEludChQUkVGX1ZPTFVNRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5hdWRpby5pbnRlcm5hbC5BdWRpb0NvcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1ZGlvQ29yZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBBdWRpb0NvcmUoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5hdWRpby5Tb3VuZAotCSAqLwotCXByb3RlY3RlZCBTb3VuZCBnZXRTb3VuZChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzb3VuZHMuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VuZHMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU291bmQ+IGdldFNvdW5kcygpIHsKLQkJcmV0dXJuIHNvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsIHVzZXIgc291bmQgbWFwLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElQYXRoPiBnZXRVc2VyU291bmRNYXAoKSB7Ci0JCWlmICh1c2VyU291bmRNYXAgPT0gbnVsbCkKLQkJCWxvYWRTb3VuZE1hcCgpOwotCQlyZXR1cm4gdXNlclNvdW5kTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBVUkwgZm9yIHRoaXMgc291bmQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldFVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodXNlclNvdW5kTWFwID09IG51bGwpCi0JCQkJbG9hZFNvdW5kTWFwKCk7Ci0JCi0JCQlJUGF0aCBwYXRoID0gdXNlclNvdW5kTWFwLmdldChpZCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCXJldHVybiBwYXRoOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBzb3VuZCBVUkw6ICIgKyBpZCwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHZvbHVtZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoUFJFRl9WT0xVTUUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi0JICoKLQkgKiBAcGFyYW0gc3RvcmUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KFBSRUZfVk9MVU1FLCAxOCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjYXRlZ29yeSBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhdGVnb3J5RW5hYmxlZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCWlmIChkaXNhYmxlZENhdGVnb3JpZXMgPT0gbnVsbCkKLQkJCWxvYWREaXNhYmxlZExpc3RzKCk7Ci0JCi0JCXJldHVybiAoIWRpc2FibGVkQ2F0ZWdvcmllcy5jb250YWlucyhpZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBzb3VuZCBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VuZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFBSRUZfU09VTkRfRU5BQkxFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzb3VuZCBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdW5kRW5hYmxlZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCWlmIChkaXNhYmxlZFNvdW5kcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJcmV0dXJuICghZGlzYWJsZWRTb3VuZHMuY29udGFpbnMoaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERpc2FibGVkTGlzdHMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChESVNBQkxFRF9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWRpc2FibGVkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlkaXNhYmxlZFNvdW5kcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0cnkgewotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkKLQkJCUlNZW1lbnRvIGNhdCA9IG1lbWVudG8uZ2V0Q2hpbGQoImNhdGVnb3JpZXMiKTsKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBjYXQuZ2V0Q2hpbGRyZW4oImNhdGVnb3J5Iik7Ci0JCi0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSU1lbWVudG8gY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJU3RyaW5nIGlkID0gY2hpbGQuZ2V0U3RyaW5nKCJpZCIpOwotCQotCQkJCQlkaXNhYmxlZENhdGVnb3JpZXMuYWRkKGlkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVhZGluZyBVUkwgbWFwICIsIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCi0JCQlJTWVtZW50byBzb3VuZCA9IG1lbWVudG8uZ2V0Q2hpbGQoInNvdW5kcyIpOwotCQkJY2hpbGRyZW4gPSBzb3VuZC5nZXRDaGlsZHJlbigic291bmQiKTsKLQkKLQkJCXNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKLQkKLQkJCQkJZGlzYWJsZWRTb3VuZHMuYWRkKGlkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVhZGluZyBVUkwgbWFwICIsIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0F1ZGlvUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQXVkaW9QbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IGxvYWQgZGlzYWJsZWQgc291bmQgaW5mb3JtYXRpb24iLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25Qb2ludHMoKSB7Ci0JCS8vIGxvYWQgZXh0ZW5zaW9uIHBvaW50cwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJhdWRpbyIpOwotCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlzb3VuZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNvdW5kPigpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjZltpXS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJCVN0cmluZyBuYW1lID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQkJaWYgKCJjYXRlZ29yeSIuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQljYXRlZ29yaWVzLnB1dChpZCwgbmFtZSk7Ci0JCQkJfSBlbHNlIGlmICgic291bmQiLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNhdGVnb3J5ID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBjZltpXS5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIik7Ci0JCi0JCQkJCVVSTCByZWFsVVJMID0gbnVsbDsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBjZltpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCksIG5ldyBQYXRoKGxvY2F0aW9uKSwgbnVsbCk7Ci0JCQkJCQlyZWFsVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJCQl9Ci0JCi0JCQkJCVNvdW5kIHNvdW5kID0gbmV3IFNvdW5kKGlkLCBjYXRlZ29yeSwgbmFtZSwgcmVhbFVSTCk7Ci0JCQkJCXNvdW5kcy5wdXQoaWQsIHNvdW5kKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGF1ZGlvOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZCBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU291bmRNYXAoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChTT1VORFNfRklMRSkudG9PU1N0cmluZygpOwotCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXVzZXJTb3VuZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBhdGg+KCk7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1hcCIpOwotCQotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKLQkJCQkJU3RyaW5nIHBhdGhTdHIgPSBjaGlsZC5nZXRTdHJpbmcoInBhdGgiKTsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHIpOwotCQotCQkJCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVhZGluZyBVUkwgbWFwICIsIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQbGF5IHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4gKHByb3ZpZGVkIHRoYXQKLQkgKiB0aGUgdXNlciBoYXMgZW5hYmxlZCB0aGUgc291bmQpCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHBsYXlTb3VuZChTdHJpbmcgaWQpIHsKLQkJaWYgKCFpc1NvdW5kRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQotCQlpZiAoIWlzU291bmRFbmFibGVkKGlkKSkKLQkJCXJldHVybjsKLQkKLQkJdHJ5IHsKLQkJCVNvdW5kIHNvdW5kID0gc291bmRzLmdldChpZCk7Ci0JCQlTdHJpbmcgY2F0ZWdvcnkgPSBzb3VuZC5nZXRDYXRlZ29yeSgpOwotCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcmllcy5jb250YWluc0tleShjYXRlZ29yeSkpIHsKLQkJCQlpZiAoIWlzQ2F0ZWdvcnlFbmFibGVkKGNhdGVnb3J5KSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQotCQkJVVJMIHVybCA9IHNvdW5kLmdldExvY2F0aW9uKCk7Ci0JCQlJUGF0aCBwYXRoID0gZ2V0VXNlclNvdW5kUGF0aChpZCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCXVybCA9IHBhdGgudG9GaWxlKCkudG9VUkwoKTsKLQkKLQkJCXBsYXlTb3VuZCh1cmwsIGdldFZvbHVtZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHBsYXlpbmcgYXVkaW86ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQbGF5cyB0aGUgc291bmQgYXQgdGhlIGdpdmVuIHVybC4KLQkgKgotCSAqIEBwYXJhbSB1cmwgamF2YS5uZXQuVVJMCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHBsYXlTb3VuZChVUkwgdXJsLCBmaW5hbCBpbnQgdm9sdW1lKSB7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJwbGF5U291bmQiKTsKLQkJCWlmICh1cmwgPT0gbnVsbCB8fCB2b2x1bWUgPD0gMCkKLQkJCQlyZXR1cm47Ci0JCi0JCQlmaW5hbCBDbGlwIGNsaXAgPSBnZXRDbGlwKHVybCk7Ci0JCQlpZiAoY2xpcCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInBsYXlpbmciKTsKLQkKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiU291bmQgVGhyZWFkIikgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gc2V0IGdhaW4KLQkJCQkJRmxvYXRDb250cm9sIGdhaW5Db250cm9sID0gKEZsb2F0Q29udHJvbCkgY2xpcC5nZXRDb250cm9sKEZsb2F0Q29udHJvbC5UeXBlLk1BU1RFUl9HQUlOKTsKLQkJCQkJZG91YmxlIHZhbHVlID0gdm9sdW1lIC8gMjAuMDsKLQkJCQkJZmxvYXQgZEIgPSAoZmxvYXQpIChNYXRoLmxvZyh2YWx1ZT09MC4wPzAuMDAwMTp2YWx1ZSkvTWF0aC5sb2coMTAuMCkqMjAuMCk7Ci0JCQkJCWdhaW5Db250cm9sLnNldFZhbHVlKGRCKTsKLQkKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3RhcnQiKTsKLQkJCQkJY2xpcC5zdGFydCgpOwotCQkJCQl0cnkgewotCQkJCQkJc2xlZXAoOTkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkKLQkJCQkJd2hpbGUgKGNsaXAuaXNBY3RpdmUoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzbGVlcCg5OSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNsaXAuc3RvcCgpOwotCQkJCQljbGlwLmNsb3NlKCk7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0b3AiKTsKLQkJCQl9Ci0JCQl9OwotCQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwbGF5aW5nIGF1ZGlvOiAiICsgdXJsLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZHMgYW5kIGNhdGVnb3JpZXMgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZURpc2FibGVkTGlzdHMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChESVNBQkxFRF9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiZGlzYWJsZWQiKTsKLQkKLQkJCUlNZW1lbnRvIGNhdCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoImNhdGVnb3JpZXMiKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlzYWJsZWRDYXRlZ29yaWVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBjYXQuY3JlYXRlQ2hpbGQoImNhdGVnb3J5Iik7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNoaWxkLnB1dFN0cmluZygiaWQiLCBpZCk7Ci0JCQl9Ci0JCi0JCQlJTWVtZW50byBzb3VuZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInNvdW5kcyIpOwotCQkJaXRlcmF0b3IgPSBkaXNhYmxlZFNvdW5kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZW1lbnRvIGNoaWxkID0gc291bmQuY3JlYXRlQ2hpbGQoInNvdW5kIik7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNoaWxkLnB1dFN0cmluZygiaWQiLCBpZCk7Ci0JCQl9Ci0JCi0JCQlmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJbWVtZW50by5zYXZlKGZvdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgZGlzYWJsZWQgaW5mb3JtYXRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2FibGVkIHNvdW5kIGxpc3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVTb3VuZE1hcCgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFNPVU5EU19GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic291bmQtbWFwIik7Ci0JCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJTb3VuZE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibWFwIik7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNoaWxkLnB1dFN0cmluZygiaWQiLCBpZCk7Ci0JCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOwotCQkJCWNoaWxkLnB1dFN0cmluZygicGF0aCIsIHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCi0JCQlmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJbWVtZW50by5zYXZlKGZvdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVVJMIG1hcCBpbmZvcm1hdGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSBhIHNwZWNpZmljIGNhdGVnb3J5LgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlFbmFibGVkKFN0cmluZyBpZCwgYm9vbGVhbiBiKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlpZiAoZGlzYWJsZWRDYXRlZ29yaWVzID09IG51bGwpCi0JCQlsb2FkRGlzYWJsZWRMaXN0cygpOwotCQotCQlpZiAoYikgewotCQkJaWYgKGRpc2FibGVkQ2F0ZWdvcmllcy5jb250YWlucyhpZCkpIHsKLQkJCQlkaXNhYmxlZENhdGVnb3JpZXMucmVtb3ZlKGlkKTsKLQkJCQlzYXZlRGlzYWJsZWRMaXN0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFkaXNhYmxlZENhdGVnb3JpZXMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZGlzYWJsZWRDYXRlZ29yaWVzLmFkZChpZCk7Ci0JCQkJc2F2ZURpc2FibGVkTGlzdHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBvciBkaXNhYmxlIGEgc3BlY2lmaWMgc291bmQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBiIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VuZEVuYWJsZWQoU3RyaW5nIGlkLCBib29sZWFuIGIpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCWlmIChkaXNhYmxlZFNvdW5kcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJaWYgKGIpIHsKLQkJCWlmIChkaXNhYmxlZFNvdW5kcy5jb250YWlucyhpZCkpIHsKLQkJCQlkaXNhYmxlZFNvdW5kcy5yZW1vdmUoaWQpOwotCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWRpc2FibGVkU291bmRzLmNvbnRhaW5zKGlkKSkgewotCQkJCWRpc2FibGVkU291bmRzLmFkZChpZCk7Ci0JCQkJc2F2ZURpc2FibGVkTGlzdHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciBzb3VuZCBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VuZHNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQUkVGX1NPVU5EX0VOQUJMRUQsIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgVVJMIGZvciB0aGlzIHNvdW5kLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBJUGF0aAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNvdW5kVVJMKFN0cmluZyBpZCwgSVBhdGggcGF0aCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBwYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlpZiAodXNlclNvdW5kTWFwID09IG51bGwpCi0JCQkJbG9hZFNvdW5kTWFwKCk7Ci0JCi0JCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQkJCXNhdmVTb3VuZE1hcCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBzb3VuZCBVUkw6ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmdWxsIHVzZXIgc291bmQgbWFwLgotCSAqCi0JICogQHBhcmFtIG1hcCB0aGUgc291bmQgbWFwCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlclNvdW5kTWFwKE1hcDxTdHJpbmcsIElQYXRoPiBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQl1c2VyU291bmRNYXAgPSBtYXA7Ci0JCQlzYXZlU291bmRNYXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZvbHVtZS4KLQkgKgotCSAqIEBwYXJhbSB2b2x1bWUgdGhlIHZvbHVtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFBSRUZfVk9MVU1FLCB2b2x1bWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZWEzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogQXVkaW8gcHJlZmVyZW5jZSBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQXVkaW9QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3Bpbm5lciB2b2x1bWU7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVBhdGg+IHVzZXJTb3VuZE1hcDsKLQotCXByb3RlY3RlZCBDYXRlZ29yeVRhYmxlVmlld2VyIHZpZXdlcjsKLQkKLQlib29sZWFuIHNvdW5kQXZhaWxhYmxlID0gdHJ1ZTsKLQotCS8qKgotCSAqIEF1ZGlvUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXVkaW9QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJbG9hZFVzZXJNYXBJbmZvKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBjaG9vc2VBdWRpb0ZpbGUoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULlNJTkdMRSk7Ci0JCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNlbGVjdEZpbGUpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmF1Oyoud2F2In0pOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkKLQkJU3RyaW5nW10gZmlsZW5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgZmlsZW5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBmaWx0ZXJQYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCXJldHVybiBuZXcgUGF0aChmaWx0ZXJQYXRoICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lc1swXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgCi0JICogb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUKLQkgKiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVMpOwotCQotCQlmaW5hbCBBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkVuYWJsZSk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuaXNTb3VuZEVuYWJsZWQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aHMuc2V0SGVscChlbmFibGVCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFKTsKLQkJCi0JCWZpbmFsIExhYmVsIHZvbHVtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl2b2x1bWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlZvbHVtZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXZvbHVtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZvbHVtZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXZvbHVtZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXZvbHVtZS5zZXRNaW5pbXVtKDApOwotCQl2b2x1bWUuc2V0TWF4aW11bSgyMCk7Ci0JCXZvbHVtZS5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Vm9sdW1lKCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCXZvbHVtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl2b2x1bWUuc2V0RW5hYmxlZChlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl3aHMuc2V0SGVscCh2b2x1bWUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FKTsKLQkJCi0JCWVuYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2b2x1bWVMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdm9sdW1lLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNvdW5kcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkNIRUNLKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAodGFibGUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFKTsKLQkJCi0JCXZpZXdlciA9IG5ldyBDYXRlZ29yeVRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoMjMsIGZhbHNlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUiwgMCk7Ci0JCWNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMSwgMTEwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5hdWRpb1ByZWZTb3VuZCk7Ci0JCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE1LCAxNTAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMik7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkZpbGUpOwotCQljb2wuc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKHRoaXMpKTsKLQkJdmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQlzZXRDaGVja1N0YXRlKHZpZXdlcik7Ci0JCQotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgb2JqOwotCQkJCQljb3JlLnNldENhdGVnb3J5RW5hYmxlZChpZCwgY2hlY2tlZCk7Ci0JCQkJCS8vdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNvdW5kIHMgPSAoU291bmQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIGNoZWNrZWQpOwotCQkJCQkJY29yZS5zZXRTb3VuZEVuYWJsZWQocy5nZXRJZCgpLCBjaGVja2VkKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBvYmo7Ci0JCQkJCWNvcmUuc2V0U291bmRFbmFibGVkKHNvdW5kLmdldElkKCksIGNoZWNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgcmlnaHQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcmlnaHQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJcmlnaHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJLy8gcGxheSBidXR0b24gYW5kIHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lcgotCQlmaW5hbCBCdXR0b24gcGxheUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZQbGF5KTsKLQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocGxheUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19QTEFZKTsKLQkKLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZCcm93c2UpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdocy5zZXRIZWxwKGJyb3dzZUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19CUk9XU0UpOwotCQotCQlmaW5hbCBCdXR0b24gcmVzZXRCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihyaWdodCwgTWVzc2FnZXMuYXVkaW9QcmVmUmVzZXQpOwotCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocmVzZXRCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfUkVTRVQpOwotCQkKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNvdW5kKSB7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgb2JqOwotCQkJCQkJVVJMIHVybCA9IGdldFNvdW5kVVJMKHNvdW5kLmdldElkKCkpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsICYmIHNvdW5kQXZhaWxhYmxlKQotCQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChnZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpICE9IG51bGwpCi0JCQkJCQkJcmVzZXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiB0YWJsZSBzZWxlY3Rpb24iLCBleCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkKLQkJc291bmRBdmFpbGFibGUgPSBBdWRpb0NvcmUuaXNBdWRpb1N1cHBvcnRlZCgpOwotCQlpZiAoc291bmRBdmFpbGFibGUpIHsKLQkJCXBsYXlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IHNlbCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKLQkJCQkJCUF1ZGlvQ29yZS5wbGF5U291bmQoZ2V0U291bmRVUkwoc291bmQuZ2V0SWQoKSksIHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gdGFibGUgc2VsZWN0aW9uIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZQotCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlJUGF0aCBwYXRoID0gY2hvb3NlQXVkaW9GaWxlKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCWludCBzZWwgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7Ci0JCQkJCQlzZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCksIHBhdGgpOwotCQkJCQkJdmlld2VyLnJlZnJlc2goc291bmQpOwotCQkJCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZXgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgc2VsID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7Ci0JCQkJCXJlbW92ZVVzZXJTb3VuZFBhdGgoc291bmQuZ2V0SWQoKSk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHNvdW5kKTsKLQkJCQkJLy9wbGF5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc2V0aW5nIHNvdW5kIiwgZXgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENoZWNrU3RhdGUoQ2hlY2tib3hUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOwotCQkKLQkJLy8gZmlyc3QsIGZpbmQgYWxsIHRoZSBjYXRlZ29yaWVzIGFuZCBzb3J0Ci0JCUxpc3Q8U3RyaW5nPiBjYXRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJY2F0cy5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOwotCQkKLQkJLy8gbGlzdCB0aGVtLCBpZ25vcmluZyBlbXB0eSBvbmVzCi0JCWl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlMaXN0IGwgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpOwotCQkJaWYgKCFsLmlzRW1wdHkoKSkgewotCQkJCWlmIChjb3JlLmlzQ2F0ZWdvcnlFbmFibGVkKGlkKSkKLQkJCQkJdmlld2VyLnNldENoZWNrZWQoaWQsIHRydWUpOwotCQkJCQotCQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJU291bmQgcyA9IChTb3VuZCkgbC5nZXQoaSk7Ci0JCQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHMuZ2V0SWQoKSkpCi0JCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChzLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGZpbmFsbHksIGxpc3QgdGhlICJtaXNjIiBzb3VuZHMKLQkJTGlzdCBsID0gQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5nZXRTb3VuZHNCeUNhdGVnb3J5KG51bGwpOwotCQlpZiAoIWwuaXNFbXB0eSgpKSB7Ci0JCQlpbnQgc2l6ZSA9IGwuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTb3VuZCBzID0gKFNvdW5kKSBsLmdldChpKTsKLQkJCQlpZiAoY29yZS5pc1NvdW5kRW5hYmxlZChzLmdldElkKCkpKQotCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChzLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgVVJMIGdldFNvdW5kVVJMKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSTCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJcmV0dXJuIEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldFNvdW5kKGlkKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0VXNlclNvdW5kUGF0aChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHBhdGggPSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nIGNyZWF0ZWQKLQkgKiBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkVXNlck1hcEluZm8oKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHVzZXIgc291bmQgbWFwCi0JCU1hcDxTdHJpbmcsIElQYXRoPiBtYXAgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyU291bmRNYXAoKTsKLQkJdXNlclNvdW5kTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUGF0aD4obWFwLnNpemUoKSk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJUGF0aCBwYXRoID0gbWFwLmdldChpZCk7Ci0JCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7Ci0JCQotCQllbmFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGNvcmUuZ2V0RGVmYXVsdFNvdW5kc0VuYWJsZWQoKSk7Ci0JCXZvbHVtZS5zZXRTZWxlY3Rpb24oY29yZS5nZXREZWZhdWx0Vm9sdW1lKCkpOwotCQotCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPigpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkJY29yZS5zZXRTb3VuZHNFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWNvcmUuc2V0Vm9sdW1lKHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JCWNvcmUuc2V0VXNlclNvdW5kTWFwKHVzZXJTb3VuZE1hcCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVc2VyU291bmRQYXRoKFN0cmluZyBpZCkgewotCQlpZiAodXNlclNvdW5kTWFwLmNvbnRhaW5zS2V5KGlkKSkKLQkJCXVzZXJTb3VuZE1hcC5yZW1vdmUoaWQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVVc2VyTWFwSW5mbygpIHsKLQkJLy8gY3JlYXRlIGEgY29weSBvZiB0aGUgdXNlciBzb3VuZCBtYXAKLQkJTWFwIG1hcCA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldFVzZXJTb3VuZE1hcCgpOwotCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPihtYXAuc2l6ZSgpKTsKLQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgbWFwLmdldChpZCk7Ci0JCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkLCBJUGF0aCBwYXRoKSB7Ci0JCXVzZXJTb3VuZE1hcC5wdXQoaWQsIHBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYTE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUNvbnRlbnRQcm92aWRlcjsKLS8qKgotICogQXVkaW8gdGFibGUgY29udGVudCBwcm92aWRlci4KLSAqLwotY2xhc3MgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU0NfQ0FURUdPUlkgPSAibWlzY0NhdGVnb3J5IjsKLQotCS8qKgotCSAqIEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCi0JICogd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LiAKLQkgKiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYSBsaXN0LCBldGMuCi0JICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNhdGVnb3JpZXMgPSBjb3JlLmdldENhdGVnb3JpZXMoKTsKLQkJTWFwPFN0cmluZywgU291bmQ+IHNvdW5kcyA9IGNvcmUuZ2V0U291bmRzKCk7Ci0JCi0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHNvdW5kcy5zaXplKCkpOwotCQotCQkvLyBmaXJzdCwgZmluZCBhbGwgdGhlIGNhdGVnb3JpZXMgYW5kIHNvcnQKLQkJTGlzdDxTdHJpbmc+IGNhdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQljYXRzLmFkZCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOwotCQlzb3J0Q2F0ZWdvcmllcyhjYXRzKTsKLQkJCi0JCS8vIGxpc3QgdGhlbSwgaWdub3JpbmcgZW1wdHkgb25lcwotCQlpdGVyYXRvciA9IGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJTGlzdDxTb3VuZD4gbCA9IGdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpOwotCQkJaWYgKCFsLmlzRW1wdHkoKSkgewotCQkJCWxpc3QuYWRkKGlkKTsKLQkJCQlzb3J0U291bmRzKGwpOwotCQotCQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWxpc3QuYWRkKGwuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQotCQkvLyBmaW5hbGx5LCBsaXN0IHRoZSAibWlzYyIgc291bmRzCi0JCUxpc3Q8U291bmQ+IGwgPSBnZXRTb3VuZHNCeUNhdGVnb3J5KG51bGwpOwotCQlpZiAoIWwuaXNFbXB0eSgpKSB7Ci0JCQlsaXN0LmFkZChNSVNDX0NBVEVHT1JZKTsKLQkJCXNvcnRTb3VuZHMobCk7Ci0JCi0JCQlpbnQgc2l6ZSA9IGwuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJbGlzdC5hZGQobC5nZXQoaSkpOwotCQl9Ci0JCi0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VuZHMgZnJvbSB0aGUgZ2l2ZW4gY2F0ZWdvcnkuIFVzZSBudWxsCi0JICogdG8gcmV0dXJuIGFsbCBtaXNjZWxsZW5lb3VzIHNvdW5kcyB3aXRoIG5vIGNhdGVnb3J5IG9yCi0JICogYW4gaW52YWxpZCBjYXRlZ29yeS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTb3VuZD4gZ2V0U291bmRzQnlDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJTWFwPFN0cmluZywgU291bmQ+IHNvdW5kcyA9IGNvcmUuZ2V0U291bmRzKCk7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOwotCQlMaXN0PFNvdW5kPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTb3VuZD4oKTsKLQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzb3VuZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJU291bmQgc291bmQgPSBzb3VuZHMuZ2V0KGlkKTsKLQkJCWlmIChjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVxdWFscyhzb3VuZC5nZXRDYXRlZ29yeSgpKSkKLQkJCQlsaXN0LmFkZChzb3VuZCk7Ci0JCQllbHNlIGlmIChjYXRlZ29yeSA9PSBudWxsICYmIChzb3VuZC5nZXRDYXRlZ29yeSgpID09IG51bGwgfHwgIWNhdGVnb3JpZXMuY29udGFpbnNLZXkoc291bmQuZ2V0Q2F0ZWdvcnkoKSkpKQotCQkJCWxpc3QuYWRkKHNvdW5kKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0cyBhIGxpc3Qgb2YgY2F0ZWdvcmllcywgaW4gcGxhY2UuCi0JICoKLQkgKiBAcGFyYW0gbGlzdCBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRDYXRlZ29yaWVzKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWlmIChzaXplIDwgMikKLQkJCXJldHVybjsKLQkJCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldENhdGVnb3JpZXMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCVN0cmluZyBhID0gbGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIGFhID0gY2F0ZWdvcmllcy5nZXQoYSk7Ci0JCQkJU3RyaW5nIGIgPSBsaXN0LmdldChqKTsKLQkJCQlTdHJpbmcgYmIgPSBjYXRlZ29yaWVzLmdldChiKTsKLQkJCQlpZiAoYWEuY29tcGFyZVRvKGJiKSA+IDApIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnRzIGEgbGlzdCBvZiBzb3VuZHMsIGluIHBsYWNlLgotCSAqCi0JICogQHBhcmFtIHNvdW5kcyBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRTb3VuZHMoTGlzdDxTb3VuZD4gc291bmRzKSB7Ci0JCWludCBzaXplID0gc291bmRzLnNpemUoKTsKLQkJaWYgKHNpemUgPCAyKQotCQkJcmV0dXJuOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpKzE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlTb3VuZCBhID0gc291bmRzLmdldChpKTsKLQkJCQlTb3VuZCBiID0gc291bmRzLmdldChqKTsKLQkJCQlpZiAoYS5nZXROYW1lKCkuY29tcGFyZVRvKGIuZ2V0TmFtZSgpKSA+IDApIHsKLQkJCQkJc291bmRzLnNldChpLCBiKTsKLQkJCQkJc291bmRzLnNldChqLCBhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkZDhjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLS8qKgotICogQXVkaW8gdGFibGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLWNsYXNzIEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJvdGVjdGVkIEF1ZGlvUHJlZmVyZW5jZVBhZ2UgcGFnZTsKLQotCS8qKgotCSAqIEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhZ2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBBdWRpb1RhYmxlTGFiZWxQcm92aWRlcihBdWRpb1ByZWZlcmVuY2VQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyAKLQkgKiB0aGF0IGFmZmVjdCB0aGUgcmVuZGVyaW5nIG9mIHRoZSB2aWV3ZXIgdGhhdCB1c2VzIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLiAgV2hlbiBhIGxhYmVsIHByb3ZpZGVyIGlzCi0JICogYXR0YWNoZWQgdG8gYSB2aWV3ZXIsIHRoZSB2aWV3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKLQkgKiB0aGlzIG1ldGhvZCB3aGVuIHRoZSB2aWV3ZXIgaXMgYmVpbmcgY2xvc2VkLiAgV2hlbiBsYWJlbCBwcm92aWRlcnMKLQkgKiBhcmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgdmlld2VyLCBpdCBpcyB0aGUgY2xpZW50J3MKLQkgKiByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBwcm92aWRlciBpcyBubyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8qQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5NSVNDX0NBVEVHT1JZKSB7Ci0JCQkJCWlmIChjb3JlLmlzQ2F0ZWdvcnlFbmFibGVkKChTdHJpbmcpIGVsZW1lbnQpKQotCQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRU5BQkxFRCk7Ci0JCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0RJU0FCTEVEKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgZWxlbWVudDsKLQkJCWlmICghY29yZS5pc0NhdGVnb3J5RW5hYmxlZChzb3VuZC5nZXRDYXRlZ29yeSgpKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19VTkFWQUlMQUJMRSk7Ci0JCQlpZiAoY29yZS5pc1NvdW5kRW5hYmxlZChzb3VuZC5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19FTkFCTEVEKTsKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0RJU0FCTEVEKTsKLQkJfSBlbHNlKi8KLQkJaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0NBVEVHT1JZKTsKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX1NPVU5EKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQlyZXR1cm4gIiI7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIGNhdGVnb3J5SWQgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQlpZiAoY2F0ZWdvcnlJZC5lcXVhbHMoQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5NSVNDX0NBVEVHT1JZKSkKLQkJCQkJcmV0dXJuICIiOyAvLyhNaXNjZWxsYW5lb3VzKSI7Ci0JCQkJTWFwIGNhdGVnb3JpZXMgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0KGNhdGVnb3J5SWQpOwotCQkJfQotCQkJcmV0dXJuICIiOwotCQl9Ci0JCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBlbGVtZW50OwotCQkKLQkJaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCVN0cmluZyBzID0gc291bmQuZ2V0TmFtZSgpOwotCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gczsKLQkJCXJldHVybiBNZXNzYWdlcy5hdWRpb1Vua25vd247Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJSVBhdGggcGF0aCA9IHBhZ2UuZ2V0VXNlclNvdW5kUGF0aChzb3VuZC5nZXRJZCgpKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQotCQkJVVJMIHVybCA9IHBhZ2UuZ2V0U291bmRVUkwoc291bmQuZ2V0SWQoKSk7Ci0JCQlpZiAodXJsID09IG51bGwpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLmF1ZGlvTm9uZTsKLQkJCXJldHVybiBNZXNzYWdlcy5hdWRpb0RlZmF1bHQ7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgCi0JICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgYSBub24tc3RydWN0dXJhbCB2aWV3ZXIgdXBkYXRlLgotCSAqIElmIHRoZSBwcm9wZXJ0eSBtZW50aW9uZWQgaW4gdGhlIHVwZGF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLAotCSAqIHRoZW4gdGhlIHZpZXdlciBuZWVkIG5vdCB1cGRhdGUgdGhlIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCB3b3VsZCBiZSB1bmFmZmVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQ2F0ZWdvcnlUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQ2F0ZWdvcnlUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWM3ZGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0NhdGVnb3J5VGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlUYWJsZVZpZXdlciBleHRlbmRzIENoZWNrYm94VGFibGVWaWV3ZXIgewotCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKLQotCXB1YmxpYyBDYXRlZ29yeVRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyKHRhYmxlKTsKLQkJY3JlYXRlQ29sb3IodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgewotCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDIyNSk7Ci0JCWMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJaWYgKGNvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgd2lkZ2V0OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJfSBlbHNlCi0JCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9JTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxNDlmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9JTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vU291bmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1NvdW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjk0MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vU291bmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0vKioKLSAqIEEgc2luZ2xlIHNvdW5kLgotICovCi1jbGFzcyBTb3VuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHVibGljIFVSTCBsb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGVnb3J5OwotCi0JLyoqCi0JICogU291bmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU291bmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU291bmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgYSBjYXRlZ29yeQotCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQotCSAqIEBwYXJhbSBsb2MgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgU291bmQoU3RyaW5nIGlkLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBuYW1lLCBVUkwgbG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCi0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0NhdGVnb3J5IG9yZy5lY2xpcHNlLmF1ZGlvLkNhdGVnb3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIG5ld0NhdGVnb3J5KSB7Ci0JCWNhdGVnb3J5ID0gbmV3Q2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0lkIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9jYXRpb24gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oVVJMIG5ld0xvY2F0aW9uKSB7Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwY2JhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERvY3VtZW50IGZyb20gYSBSZWFkZXIgYW5kIGFuc3dlciBhIHJvb3QgbWVtZW50byBmb3IgcmVhZGluZyAKLQkgKiBhIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChSZWFkZXIgcmVhZGVyKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgYSB0eXBlCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50OwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSkgewotCQkKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW4pOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCi0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzM5MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgY29tbWFuZCBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbmFtZSBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKTsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0KSB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHQpIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdCkgewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBhZGFwdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2NTYwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3MgcHVibGlzaGVyIHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBQdWJsaXNoZXIgcHViOwotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkRW5hYmxlZDsKLQotCS8qKgotCSAqIFNldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcHViIGEgcHVibGlzaGVyCi0JICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0aGUgcHVibGlzaGVyIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCi0JICovCi0JcHVibGljIFNldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFB1Ymxpc2hlciBwdWIsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnB1YiA9IHB1YjsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRFbmFibGVkID0gc3djLmlzUHVibGlzaGVyRW5hYmxlZChwdWIpOwotCQlzd2Muc2V0UHVibGlzaGVyRW5hYmxlZChwdWIsIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRQdWJsaXNoZXJFbmFibGVkKHB1Yiwgb2xkRW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODkyOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlcidzIGF1dG8tcHVibGlzaCBzZXR0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgc2V0dGluZzsKLQlwcm90ZWN0ZWQgaW50IG9sZFNldHRpbmc7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2V0dGluZyB0aGUgYXV0by1wdWJsaXNoIHNldHRpbmcKLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBpbnQgc2V0dGluZykgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnNldHRpbmcgPSBzZXR0aW5nOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCW9sZFNldHRpbmcgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCk7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFNldHRpbmcoc2V0dGluZyk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJc3djLnNldEF1dG9QdWJsaXNoU2V0dGluZyhvbGRTZXR0aW5nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5NDlmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3MgYXV0by1wdWJsaXNoIHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCB0aW1lOwotCXByb3RlY3RlZCBpbnQgb2xkVGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldEF1dG9QdWJsaXNoVGltZSgpOwotCQlzd2Muc2V0QXV0b1B1Ymxpc2hUaW1lKHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFRpbWUob2xkVGltZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxYmI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9sZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgSUZvbGRlciBmb2xkZXI7Ci0JcHJvdGVjdGVkIElGb2xkZXIgb2xkRm9sZGVyOwotCi0JLyoqCi0JICogU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBmb2xkZXIgYSBuZXcgc2VydmVyIGNvbmZpZ3VyYXRpb24gbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgSUZvbGRlciBmb2xkZXIpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZCk7Ci0JCXRoaXMuZm9sZGVyID0gZm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkRm9sZGVyID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJc2VydmVyLnNldFNlcnZlckNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uKG9sZEZvbGRlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVySG9zdG5hbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckhvc3RuYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNThiZDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVySG9zdG5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBob3N0bmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZE5hbWU7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBuYW1lIGEgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcwotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGROYW1lID0gc2VydmVyLmdldEhvc3QoKTsKLQkJc2VydmVyLnNldEhvc3QobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0SG9zdChvbGROYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE0MTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIG5hbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJOYW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZE5hbWU7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJOYW1lQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG5hbWUgYSBuYW1lIGZvciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIFNldFNlcnZlck5hbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lQ29tbWFuZCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGROYW1lID0gc2VydmVyLmdldE5hbWUoKTsKLQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0TmFtZShvbGROYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM5YTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyUnVudGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBydW50aW1lLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyUnVudGltZUNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgcnVudGltZTsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgb2xkUnVudGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlclJ1bnRpbWVDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlclJ1bnRpbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWVDb21tYW5kKTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQlzZXJ2ZXIuc2V0UnVudGltZShydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRSdW50aW1lKG9sZFJ1bnRpbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y2ZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIncyBzdGFydCB0aW1lb3V0IHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJTdGFydFRpbWVvdXRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCB0aW1lOwotCXByb3RlY3RlZCBpbnQgb2xkVGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldFN0YXJ0VGltZW91dCgpOwotCQlzd2Muc2V0U3RhcnRUaW1lb3V0KHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRTdGFydFRpbWVvdXQob2xkVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzE4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3Mgc3RvcCB0aW1lb3V0IHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IHRpbWU7Ci0JcHJvdGVjdGVkIGludCBvbGRUaW1lOwotCi0JLyoqCi0JICogU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdGltZSBhIHB1Ymxpc2ggdGltZQotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldFN0b3BUaW1lb3V0KCk7Ci0JCXN3Yy5zZXRTdG9wVGltZW91dCh0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlzd2Muc2V0U3RvcFRpbWVvdXQob2xkVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0dsb2JhbENvbW1hbmRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzM2JhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbENvbW1hbmRNYW5hZ2VyIHsKLQkvLyBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyBpbiB0aGUgaGlzdG9yeQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSElTVE9SWSA9IDIwMDsKLQotCWNsYXNzIFNlcnZlclJlc291cmNlQ29tbWFuZCB7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kOwotCQlTdHJpbmcgaWQ7Ci0JfQotCi0JLy8gY29tbWFuZHMgaW4gdGhlIHVuZG8gaGlzdG9yeQotCXByb3RlY3RlZCBMaXN0PFNlcnZlclJlc291cmNlQ29tbWFuZD4gdW5kb0xpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlclJlc291cmNlQ29tbWFuZD4oKTsKLQotCS8vIHNpemUgb2YgdGhlIHVuZG8gc3RhY2sgb24gbGFzdCBzYXZlCi0JcHJvdGVjdGVkIGludCB1bmRvU2F2ZUluZGV4ID0gMDsKLQotCS8vIGNvbW1hbmRzIGluIHRoZSByZWRvIGhpc3RvcnkKLQlwcm90ZWN0ZWQgTGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+IHJlZG9MaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+KCk7Ci0KLQljbGFzcyBDb21tYW5kTWFuYWdlckluZm8gewotCQkvLyBudW1iZXIgb2Ygb3BlbiBlZGl0b3JzIG9uIHRoaXMgcmVzb3VyY2UKLQkJaW50IGNvdW50OwotCQkKLQkJLy8gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIHNhdmVkIHNpbmNlCi0JCS8vIHRoZSBsYXN0IGNoYW5nZQotCQlib29sZWFuIGlzRGlydHk7Ci0JCQotCQkvLyB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyByZWFkLW9ubHkKLQkJYm9vbGVhbiBpc1JlYWRPbmx5OwotCQkKLQkJLy8gdGhlIGVsZW1lbnQgaWQKLQkJU3RyaW5nIGlkOwotCQkKLQkJLy8gdGhlIHdvcmtpbmcgY29weQotCQlJU2VydmVyV29ya2luZ0NvcHkgd2M7Ci0JCQotCQkvLyBmaWxlcyBhbmQgdGltZXN0YW1wcwotCQlNYXA8SUZpbGUsIExvbmc+IGZpbGVNYXA7Ci0JCQotCQlpbnQgdGltZXN0YW1wOwotCX0KLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBDb21tYW5kTWFuYWdlckluZm8+IGNvbW1hbmRNYW5hZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tbWFuZE1hbmFnZXJJbmZvPigpOwotCi0JLy8gcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycwotCXByb3RlY3RlZCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHByb3BlcnR5TGlzdGVuZXJzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElSVFkgPSAiZGlydHlTdGF0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VTkRPID0gInVuZG9BY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUkVETyA9ICJyZWRvQWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFTE9BRCA9ICJyZWxvYWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBHbG9iYWxDb21tYW5kTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgR2xvYmFsQ29tbWFuZE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgR2xvYmFsQ29tbWFuZE1hbmFnZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGluc3RhbmNlLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5zdGFuY2UuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCS8vVHJhY2UudHJhY2UoIkZpcmluZzogIiArIGV2ZW50ICsgIiAiICsgb2xkVmFsdWUpOwotCQl0cnkgewotCQkJaW50IHNpemUgPSBwcm9wZXJ0eUxpc3RlbmVycy5zaXplKCk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcGNsID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbc2l6ZV07Ci0JCQlwcm9wZXJ0eUxpc3RlbmVycy50b0FycmF5KHBjbCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXRyeSB7Ci0JCQkJCXBjbFtpXS5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiR2V0dGluZyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uY291bnQgKys7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNyZWF0aW5nIG5ldyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IG5ldyBDb21tYW5kTWFuYWdlckluZm8oKTsKLQkJCWluZm8uY291bnQgPSAxOwotCQkJaW5mby5pZCA9IGlkOwotCQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlpbmZvLndjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQlpbmZvLmlzRGlydHkgPSBmYWxzZTsKLQkJCWluZm8uaXNSZWFkT25seSA9IGZhbHNlOwotCQkJY29tbWFuZE1hbmFnZXJzLnB1dChpZCwgaW5mbyk7Ci0JCQl1cGRhdGVUaW1lc3RhbXBzKGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBvYnRhaW4gY29tbWFuZCBtYW5hZ2VyIiwgZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQ29tbWFuZE1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlbGVhc2luZyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uY291bnQgLS07Ci0JCQkJaWYgKGluZm8uY291bnQgPT0gMCkgewotCQkJCQljb21tYW5kTWFuYWdlcnMucmVtb3ZlKGlkKTsKLQkJCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCQkJCWNsZWFyUmVkb0xpc3QoaWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZWxlYXNlIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsb2FkIHRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIGEgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2FkKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQlzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoaWQpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJaW5mby53YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVMT0FELCBpZCwgbnVsbCk7Ci0JCQl9Ci0JCQljbGVhclVuZG9MaXN0KGlkKTsKLQkJCWNsZWFyUmVkb0xpc3QoaWQpOwotCQkJdW5kb1NhdmVJbmRleCA9IHVuZG9MaXN0LnNpemUoKTsKLQkJCXNldERpcnR5U3RhdGUoaWQsIGZhbHNlKTsKLQkJCXVwZGF0ZVRpbWVzdGFtcHMoaWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHJlbGVhc2UgY29tbWFuZCBtYW5hZ2VyIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZE1hbmFnZXJJbmZvIGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGZpbmQgZXhpc3RpbmcgY29tbWFuZCBtYW5hZ2VyIGluZm8iKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgb25seSBvbmUgY29tbWFuZCBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9ubHkgY29tbWFuZCBtYW5hZ2VyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmx5Q29tbWFuZE1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlyZXR1cm4gKGluZm8gIT0gbnVsbCAmJiBpbmZvLmNvdW50ID09IDEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBnZXRQYXJ0SW5wdXQoU3RyaW5nIHNlcnZlcklkLCBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBzZXJ2ZXJJbmZvID0gbnVsbDsKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IG51bGw7Ci0JCWJvb2xlYW4gc2VydmVyUmVhZE9ubHkgPSBmYWxzZTsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCXNlcnZlckluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhzZXJ2ZXJJZCk7Ci0JCQlpZiAoc2VydmVySW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlzZXJ2ZXIgPSBzZXJ2ZXJJbmZvLndjOwotCQkJc2VydmVyUmVhZE9ubHkgPSBzZXJ2ZXJJbmZvLmlzUmVhZE9ubHk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFNlcnZlckVkaXRvclBhcnRJbnB1dChzZXJ2ZXJDb21tYW5kTWFuYWdlciwgc2VydmVyLCBzZXJ2ZXJSZWFkT25seSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyUmVzb3VyY2UoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJcmV0dXJuIGluZm8ud2M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHNoZWxsLgotCSAqIAotCSAqIEByZXR1cm4gYSBzaGVsbAotCSAqLwotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXRyeSB7Ci0JCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkID09IG51bGwpCi0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJCi0JCQlyZXR1cm4gZC5nZXRBY3RpdmVTaGVsbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBzaGVsbCIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIGFuZCBwbGFjZSBpdCBpbiB0aGUgdW5kbyBzdGFjay4KLQkgKiBJZiB0aGUgY29tbWFuZCBjYW5ub3QgYmUgdW5kb25lLCB0aGUgdXNlciB3aWxsIGJlIG5vdGlmaWVkCi0JICogYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgotCSAqCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIGNvbW1hbmQgYSB0YXNrCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGlkLCBJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZCkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQotCQlpZiAoIWNvbW1hbmQuY2FuVW5kbygpICYmICF1bmRvTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJFZGl0b3IsIE1lc3NhZ2VzLmVkaXRvclByb21wdElycmV2ZXJzaWJsZSkpCi0JCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSBuZXcgU2VydmVyUmVzb3VyY2VDb21tYW5kKCk7Ci0JCXNyYy5pZCA9IGlkOwotCQlzcmMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQotCQl0cnkgewotCQkJSUFkYXB0YWJsZSBhZGFwdGFibGUgPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQkJcmV0dXJuIHNoZWxsOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgYWRhcHRhYmxlKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBleGVjdXRpbmcgY29tbWFuZCIsIGNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoY29tbWFuZC5jYW5VbmRvKCkpCi0JCQlhZGRUb1VuZG9MaXN0KHNyYyk7Ci0JCWVsc2UgewotCQkJdW5kb1NhdmVJbmRleCA9IC0xOwotCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCX0KLQkJCi0JCS8vIGNsZWFyIHJlZG8gbGlzdCBzaW5jZSBhIG5ldyBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLgotCQljbGVhclJlZG9MaXN0KGlkKTsKLQkJCi0JCXNldERpcnR5U3RhdGUoaWQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNvbW1hbmQgdG8gdGhlIGhpc3RvcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvVW5kb0xpc3QoU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYykgewotCQl1bmRvTGlzdC5hZGQoc3JjKTsKLQotCQkvLyBsaW1pdCBoaXN0b3J5IGdyb3d0aAotCQlpZiAodW5kb0xpc3Quc2l6ZSgpID4gTUFYX0hJU1RPUlkpCi0JCQl1bmRvTGlzdC5yZW1vdmUoMCk7Ci0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBzcmMuaWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgdW5kbyBvZiBhIHBhcnRpY3VsYXIgcmVzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVW5kb0xpc3QoU3RyaW5nIGlkKSB7Ci0JCWludCBpID0gMDsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaSA8IHVuZG9MaXN0LnNpemUoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IHVuZG9MaXN0LmdldChpKTsKLQkJCWlmIChzcmMuaWQuZXF1YWxzKGlkKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl1bmRvTGlzdC5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UKLQkJCQlpKys7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkKQotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSByZWRvIG9mIGEgcGFydGljdWxhciByZXNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJSZWRvTGlzdChTdHJpbmcgaWQpIHsKLQkJaW50IGkgPSAwOwotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCXdoaWxlIChpIDwgcmVkb0xpc3Quc2l6ZSgpKSB7Ci0JCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gcmVkb0xpc3QuZ2V0KGkpOwotCQkJaWYgKHNyYy5pZC5lcXVhbHMoaWQpKSB7Ci0JCQkJcmVkb0xpc3QucmVtb3ZlKGkpOwotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCWkrKzsKLQkJfQotCQlpZiAobW9kaWZpZWQpCi0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIGlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIHVuZG9uZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5VbmRvKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHVuZG9MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjLmlkID09IGEgfHwgc3JjLmlkID09IGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIHJlZG9uZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWRvKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZG9MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjLmlkID09IGEgfHwgc3JjLmlkID09IGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgd291bGQgYmUgdW5kb25lIG5leHQuCi0JICogCi0JICogQHBhcmFtIGEgYW4gaWQKLQkgKiBAcmV0dXJuIGEgdGFzawotCSAqLwotCXB1YmxpYyBJVW5kb2FibGVPcGVyYXRpb24gZ2V0VW5kb0NvbW1hbmQoU3RyaW5nIGEpIHsKLQkJaW50IHNpemUgPSB1bmRvTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSB1bmRvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjLmlkID09IGEpCi0JCQkJcmV0dXJuIHNyYy5jb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCB3b3VsZCBiZSByZWRvbmUgbmV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gYSBhbiBpZAotCSAqIEByZXR1cm4gYSB0YXNrCi0JICovCi0JcHVibGljIElVbmRvYWJsZU9wZXJhdGlvbiBnZXRSZWRvQ29tbWFuZChTdHJpbmcgYSkgewotCQlpbnQgc2l6ZSA9IHJlZG9MaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IHJlZG9MaXN0LmdldChpKTsKLQkJCWlmIChzcmMuaWQgPT0gYSkKLQkJCQlyZXR1cm4gc3JjLmNvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgaXMgImRpcnR5Ii4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gYSB0YXNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eShTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gaW5mby5pc0RpcnR5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciByZXNvdXJjZSBpcyByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGluZm8uaXNSZWFkT25seTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyIHJlc291cmNlIHJlYWQtb25seSBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSByZWFkT25seSA8Y29kZT50cnVlPC9jb2RlPiB0byBzZXQgcmVhZC1vbmx5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoU3RyaW5nIGlkLCBib29sZWFuIHJlYWRPbmx5KSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGluZm8uaXNSZWFkT25seSA9PSByZWFkT25seSkKLQkJCXJldHVybjsKLQkJaW5mby5pc1JlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVMT0FELCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgZmlsZXMgYXJlIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGVzIGFyZSByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVGaWxlc1JlYWRPbmx5KFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChnZXRSZWFkT25seUZpbGVzKGlkKS5sZW5ndGggPiAwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlydHkgc3RhdGUgYW5kIGZpcmVzIGFuIGV2ZW50IGlmIG5lZWRlZC4KLQkgKiBAcGFyYW0gZGlydHkgYm9vbGVhbgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREaXJ0eVN0YXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkaXJ0eSkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8uaXNEaXJ0eSA9PSBkaXJ0eSkKLQkJCXJldHVybjsKLQkJCi0JCWluZm8uaXNEaXJ0eSA9IGRpcnR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX0RJUlRZLCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG8oU3RyaW5nIGEpIHsKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdW5kb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYzIgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjMi5pZCA9PSBhKQotCQkJCXNyYyA9IHNyYzI7Ci0JCX0KLQkJaWYgKHNyYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCXNyYy5jb21tYW5kLnVuZG8obnVsbCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotCQkJLy8gZG8gc29tZXRoaW5nCi0JCX0KLQkJCi0JCXVuZG9MaXN0LnJlbW92ZShzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIHNyYy5pZCwgbnVsbCk7Ci0JCXJlZG9MaXN0LmFkZChzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIHNyYy5pZCwgbnVsbCk7Ci0JCQotCQlpZiAodW5kb1NhdmVJbmRleCA9PSB1bmRvTGlzdC5zaXplKCkpCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgZmFsc2UpOwotCQllbHNlCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVkbyB0aGUgbGFzdCBjb21tYW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZG8oU3RyaW5nIGEpIHsKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYzIgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjMi5pZCA9PSBhKQotCQkJCXNyYyA9IHNyYzI7Ci0JCX0KLQkJaWYgKHNyYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHNyYy5jb21tYW5kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgYWRhcHRhYmxlKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBleGVjdXRpbmcgY29tbWFuZCIsIGNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlyZWRvTGlzdC5yZW1vdmUoc3JjKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9SRURPLCBzcmMuaWQsIG51bGwpOwotCQl1bmRvTGlzdC5hZGQoc3JjKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBzcmMuaWQsIG51bGwpOwotCQkKLQkJaWYgKHVuZG9TYXZlSW5kZXggPT0gdW5kb0xpc3Quc2l6ZSgpKQotCQkJc2V0RGlydHlTdGF0ZShzcmMuaWQsIGZhbHNlKTsKLQkJZWxzZQotCQkJc2V0RGlydHlTdGF0ZShzcmMuaWQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgaGlzdG9yeSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoU3RyaW5nIGlkKSB7Ci0JCXVuZG9TYXZlSW5kZXggPSB1bmRvTGlzdC5zaXplKCk7Ci0JCXNldERpcnR5U3RhdGUoaWQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcmVhZC1vbmx5IGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlW10gZ2V0UmVhZE9ubHlGaWxlcyhJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8SUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXNlcnZlcikuZ2V0RmlsZSgpOwotCQkJCi0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJCi0JCQlJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShmaWxlcyk7Ci0JCQlyZXR1cm4gZmlsZXM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJnZXRSZWFkT25seUZpbGVzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElGaWxlW10gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGaWxlWzBdOwotCQkKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGaWxlWzBdOwotCQkKLQkJcmV0dXJuIGdldFJlYWRPbmx5RmlsZXMoaW5mby53Yyk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlW10gZ2V0UmVhZE9ubHlGaWxlcyhTdHJpbmcgaWQpIHsKLQkJTGlzdDxJRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCUlGaWxlW10gZmlsZXMgPSBnZXRTZXJ2ZXJSZXNvdXJjZUZpbGVzKGlkKTsKLQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNSZWFkT25seSgpKQotCQkJCWxpc3QuYWRkKGZpbGVzW2ldKTsKLQkJfQotCQkKLQkJSUZpbGVbXSBmaWxlTGlzdCA9IG5ldyBJRmlsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShmaWxlTGlzdCk7Ci0JCXJldHVybiBmaWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHRpbWVzdGFtcHMuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGltZXN0YW1wcyhTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbmZvLmZpbGVNYXAgPSBuZXcgSGFzaE1hcDxJRmlsZSwgTG9uZz4oKTsKLQkJSUZpbGVbXSBmaWxlcyA9IGdldFNlcnZlclJlc291cmNlRmlsZXMoaWQpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldICE9IG51bGwpIHsKLQkJCQkJRmlsZSBmID0gZmlsZXNbaV0uZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCQkJaWYgKGYgIT0gbnVsbCkgewotCQkJCQkJbG9uZyB0aW1lID0gZi5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJCWluZm8uZmlsZU1hcC5wdXQoZmlsZXNbaV0sIG5ldyBMb25nKHRpbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpbmZvLnRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcChpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRUaW1lc3RhbXAoQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8pIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBpbmZvLndjLmdldE9yaWdpbmFsKCk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gKChTZXJ2ZXIpc2VydmVyKS5nZXRUaW1lc3RhbXAoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0NoYW5nZWQoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmlsZVtdIGZpbGVzID0gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhpZCk7Ci0JCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvdW50Kys7Ci0JCQlGaWxlIGYgPSBmaWxlc1tpXS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJdHJ5IHsKLQkJCQlMb25nIHRpbWUgPSBpbmZvLmZpbGVNYXAuZ2V0KGZpbGVzW2ldKTsKLQkJCQlpZiAodGltZS5sb25nVmFsdWUoKSAhPSBmLmxhc3RNb2RpZmllZCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWludCB0aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoaW5mbyk7Ci0JCWlmIChpbmZvLnRpbWVzdGFtcCAhPSB0aW1lc3RhbXApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChjb3VudCAhPSBpbmZvLmZpbGVNYXAuc2l6ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lPcmRlcmVkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSU9yZGVyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3MmY4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSU9yZGVyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0vKioKLSAqIEFuIG9iamVjdCB0aGF0IGhhcyBhbiBhYnNvbHV0ZSBvcmRlcmluZywgYW5kIGNhbiBiZSBvcmRlcmVkIGFnYWluc3Qgb3RoZXIgb2JqZWN0cy4KLSAqIAotICogPHA+Ci0gKiBbaXNzdWU6IEl0IGlzIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBwbGFjZSBhbnkga2luZCBvZgotICogdXNlZnVsIG9yZGVyIG9uIG9iamVjdHMgdGhhdCBhcmUgY29udHJpYnV0ZWQgaW5kZXBlbmRlbnRseSBieQotICogbm9uLWNvbGxhYm9yYXRpbmcgcGFydGllcy4gVGhlIElPcmRlcmVkIG1lY2hhbmlzbSBpcyB3ZWFrLCBhbmQKLSAqIGNhbid0IHJlYWxseSBzb2x2ZSB0aGUgcHJvYmxlbS4gSXNzdWVzIG9mIHByZXNlbnRhdGlvbiBhcmUgdXN1YWxseQotICogYmVzdCBsZWZ0IHRvIHRoZSBVSSwgd2hpY2ggY2FuIHNvcnQgb2JqZWN0cyBiYXNlZCBvbiBhcmJpdHJhcnkKLSAqIHByb3BlcnRpZXMuXQotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9yZGVyZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyIChpbmRleC9wcmlvcml0eSkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3OTFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKLS8qKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSBleHRlbmRzIElPcmRlcmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgcmVzb3VyY2UgdHlwZSAoZ2l2ZW4gYnkgdGhlCi0JICogaWQpIGNhbiBiZSBvcGVuZWQgd2l0aCB0aGlzIGVkaXRvci4gVGhpcyByZXN1bHQgaXMgYmFzZWQgb24KLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSBnZXRGYWN0b3J5SWRzKCkgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWRpdG9yIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUgd2l0aCB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIFRoaXMgYWxsb3dzIChmb3IgaW5zdGFuY2UpIGNvbXBsZXggY29uZmlndXJhdGlvbiBwYWdlcyB0byBvbmx5IGJlIHNob3duIHdoZW4gdXNlZAotCSAqIHdpdGggbm9uLXVuaXR0ZXN0IHNlcnZlcnMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzaG91bGQgZGlzcGxheQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSBhbiBlZGl0b3Igc2l0ZQotCSAqIEBwYXJhbSBpbnB1dCBhIHNlcnZlciBlZGl0b3IgaW5wdXQKLQkgKiBAcmV0dXJuIGFuIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGNyZWF0ZUFjdGlvbihJRWRpdG9yU2l0ZSBzaXRlLCBJU2VydmVyRWRpdG9yUGFydElucHV0IGlucHV0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZWM4ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotLyoqCi0gKiBUaGlzIGlzIHRoZSBlZGl0b3IgaW5wdXQgZm9yIHRoZSBzZXJ2ZXIgYW5kIHNlcnZlcgotICogY29uZmlndXJhdGlvbiBlZGl0b3IuIFRoZSBpbnB1dCBpbmNsdWRlcyBib3RoIGEgc2VydmVyCi0gKiBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKgotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JJbnB1dCBleHRlbmRzIElFZGl0b3JJbnB1dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5lZGl0b3IiOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGlkLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQzODUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JTZWN0aW9uOwotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgZXh0ZW5kcyBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQuCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIHR5cGVzIGF0dHJpYnV0ZS4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zZXJ0aW9uSWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzZWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIHdpdGggdGhlIGdpdmVuIHNlcnZlci4KLQkgKiBUaGlzIGFsbG93cyAoZm9yIGluc3RhbmNlKSBjb21wbGV4IGNvbmZpZ3VyYXRpb24gcGFnZXMgdG8gb25seSBiZSBzaG93biB3aGVuIHVzZWQKLQkgKiB3aXRoIG5vbi11bml0dGVzdCBzZXJ2ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBzaG93biwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYwMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IGV4dGVuZHMgSU9yZGVyZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlzcGxheWFibGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIHR5cGVzIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBpbnNlcnRpb24gaWQgaXMgc3VwcG9ydGVkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluc2VydGlvbiBpZCBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0luc2VydGlvbklkKFN0cmluZyBpZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWRpdG9yIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUgd2l0aCB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIFRoaXMgYWxsb3dzIChmb3IgaW5zdGFuY2UpIGNvbXBsZXggY29uZmlndXJhdGlvbiBwYWdlcyB0byBvbmx5IGJlIHNob3duIHdoZW4gdXNlZAotCSAqIHdpdGggbm9uLXVuaXR0ZXN0IHNlcnZlcnMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVQYWdlKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBlZGl0b3IgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0b3IgcGFnZQotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBjcmVhdGVQYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJ2aWV3RWRpdG9yUGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJ2aWV3RWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQzYTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9PdmVydmlld0VkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQXV0b0NvbXBsZXRlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LlRleHRDb250ZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSUZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLk1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIFNlcnZlciBnZW5lcmFsIGVkaXRvciBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgT3ZlcnZpZXdFZGl0b3JQYXJ0IGV4dGVuZHMgU2VydmVyRWRpdG9yUGFydCB7Ci0JcHJvdGVjdGVkIFRleHQgc2VydmVyTmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBzZXJ2ZXJDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBUZXh0IGhvc3RuYW1lOwotCXByb3RlY3RlZCBDb21ibyBydW50aW1lQ29tYm87Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhdXRvUHVibGlzaERpc2FibGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhdXRvUHVibGlzaEVuYWJsZTsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBhdXRvUHVibGlzaFRpbWU7Ci0JcHJvdGVjdGVkIFRhYmxlIHB1Ymxpc2hlcnNUYWJsZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwdWJsaXNoZXJzVmlld2VyOwotCXByb3RlY3RlZCBTcGlubmVyIHN0YXJ0VGltZW91dFNwaW5uZXI7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgc3RvcFRpbWVvdXRTcGlubmVyOwotCXByb3RlY3RlZCBNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybTsKLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nOwotCi0JcHJvdGVjdGVkIElSdW50aW1lW10gcnVudGltZXM7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHJ1bnRpbWVMaXN0ZW5lcjsKLQotCWNsYXNzIFB1Ymxpc2hlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgUHVibGlzaGVyW10gcHViczsKLQkJcHVibGljIFB1Ymxpc2hlckNvbnRlbnRQcm92aWRlcihQdWJsaXNoZXJbXSBwdWJzKSB7Ci0JCQl0aGlzLnB1YnMgPSBwdWJzOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBwdWJzOwotCQl9Ci0JfQotCi0JY2xhc3MgUHVibGlzaExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQdWJsaXNoZXIpIHsKLQkJCQlQdWJsaXNoZXIgcHViID0gKFB1Ymxpc2hlcikgZWxlbWVudDsKLQkJCQlyZXR1cm4gcHViLmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiAiIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJ2aWV3RWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPdmVydmlld0VkaXRvclBhcnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygiY29uZmlndXJhdGlvbi1pZCIpICYmIHNlcnZlckNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQkKLQkJCQkvLyBmb2xsb3dpbmcgY29kZSBiZWhhdmVzIHBvb3JseSBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgbG9jYWwgb3IgcmVtb3RlCi0JCQkJLy8gcHVibGlzaGluZyB0aW1lIHBlciBzZXJ2ZXIgb3Igc2VydmVyIHR5cGUuIGFzIGEgcmVzdWx0IGl0IHNldHMgdGhlIHZhbHVlCi0JCQkJLy8gdG8gdGhlIGRlZmF1bHQsIHdoaWNoIHNlZW1zIHRvIGJlIG1vcmUgaGFybSB0aGFuIGdvb2QgdW50aWwgd2UgcmV2YW1wIHRoZQotCQkJCS8vIGRlZmF1bHQgcHVibGlzaGluZyB0aW1lcwotCQkJCS8qaWYgKCJob3N0bmFtZSIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlmaW5hbCBTdHJpbmcgb2xkSG9zdG5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmaW5hbCBTdHJpbmcgbmV3SG9zdG5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlmaW5hbCBib29sZWFuIGlzTmV3SG9zdG5hbWVMb2NhbGhvc3QgPSBTb2NrZXRVdGlsLmlzTG9jYWxob3N0KG5ld0hvc3RuYW1lKTsKLQkJCQkJaWYgKGlzTmV3SG9zdG5hbWVMb2NhbGhvc3QgIT0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChvbGRIb3N0bmFtZSkpIHsKLQkJCQkJCS8vIHJ1biB0aGlzIGNvZGUgb25seSBpZiB0aGUgaG9zdG5hbWUgY2hhbmdlZCBmcm9tCi0JCQkJCQkvLyAnbG9jYWxob3N0JyB0byBhIHJlbW90ZSBuYW1lLCBvciB2aWNlLXZlcnNhCi0JCQkJCQlob3N0bmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoaXNOZXdIb3N0bmFtZUxvY2FsaG9zdCkgewotCQkJCQkJCQkJCWludCBhdXRvUHVibGlzaFRpbWUyID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRBdXRvUHVibGlzaExvY2FsVGltZSgpOwotCQkJCQkJCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpZ2V0U2VydmVyKCkpLnNldEF1dG9QdWJsaXNoVGltZShhdXRvUHVibGlzaFRpbWUyKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJaW50IGF1dG9QdWJsaXNoVGltZTIgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmdldEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpOwotCQkJCQkJCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpZ2V0U2VydmVyKCkpLnNldEF1dG9QdWJsaXNoVGltZShhdXRvUHVibGlzaFRpbWUyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdXBkYXRlIHB1Ymxpc2ggdGltZSB0byBuZXcgaG9zdCIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9Ki8KLQkJCQkKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygibmFtZSIpKQotCQkJCQl1cGRhdGVOYW1lcygpOwotCQkJCWVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygiaG9zdG5hbWUiKSAmJiBob3N0bmFtZSAhPSBudWxsKSB7Ci0JCQkJCWhvc3RuYW1lLnNldFRleHQoKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInJ1bnRpbWUtaWQiKSkgewotCQkJCQlTdHJpbmcgcnVudGltZUlkID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCQkJCWlmIChydW50aW1lSWQgIT0gbnVsbCkKLQkJCQkJCXJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lKHJ1bnRpbWVJZCk7Ci0JCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygiY29uZmlndXJhdGlvbi1pZCIpICYmIHNlcnZlckNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0VGV4dChwYXRoKTsKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9BVVRPX1BVQkxJU0hfVElNRSkpIHsKLQkJCQkJSW50ZWdlciBjdXJBdXRvUHVibGlzaFRpbWUgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKGN1ckF1dG9QdWJsaXNoVGltZS5pbnRWYWx1ZSgpKTsKLQkJCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChhdXRvUHVibGlzaFRpbWUpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNlcnZlci5QUk9QX0FVVE9fUFVCTElTSF9TRVRUSU5HKSkgewotCQkJCQlJbnRlZ2VyIGF1dG9QdWJsaXNoU2V0dGluZyA9IChJbnRlZ2VyKWV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWludCBzZXR0aW5nID0gYXV0b1B1Ymxpc2hTZXR0aW5nLmludFZhbHVlKCk7Ci0JCQkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldFNlbGVjdGlvbihzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRU5BQkxFKTsKLQkJCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLnNldFNlbGVjdGlvbihzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSk7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKHNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9FTkFCTEUpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNlcnZlci5QUk9QX1NUQVJUX1RJTUVPVVQpKSB7Ci0JCQkJCUludGVnZXIgdGltZSA9IChJbnRlZ2VyKWV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0U2VsZWN0aW9uKHRpbWUuaW50VmFsdWUoKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoc3RhcnRUaW1lb3V0U3Bpbm5lcik7Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoU2VydmVyLlBST1BfU1RPUF9USU1FT1VUKSkgewotCQkJCQlJbnRlZ2VyIHRpbWUgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlzdG9wVGltZW91dFNwaW5uZXIuc2V0U2VsZWN0aW9uKHRpbWUuaW50VmFsdWUoKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoc3RvcFRpbWVvdXRTcGlubmVyKTsKLQkJCQl9IGVsc2UgaWYgKFNlcnZlci5QUk9QX1BVQkxJU0hFUlMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAocHVibGlzaGVyc1ZpZXdlciA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSAoTGlzdDxTdHJpbmc+KSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kID0gaWQuaW5kZXhPZigiOiIpOwotCQkJCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlpZiAoInRydWUiLmVxdWFscyhpZC5zdWJzdHJpbmcoaW5kKzEpKSkKLQkJCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJCWlkID0gaWQuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQkJCQlQdWJsaXNoZXIgcHViID0gU2VydmVyUGx1Z2luLmZpbmRQdWJsaXNoZXIoaWQpOwotCQkJCQkJaWYgKHB1YiAhPSBudWxsKQotCQkJCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q2hlY2tlZChwdWIsIGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lcygpIHsKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCkKLQkJCXNlcnZlck5hbWUuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTV1QgY29udHJvbHMgZm9yIHRoaXMgd29ya2JlbmNoIHBhcnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFuYWdlZEZvcm0gPSBuZXcgTWFuYWdlZEZvcm0ocGFyZW50KTsKLQkJc2V0TWFuYWdlZEZvcm0obWFuYWdlZEZvcm0pOwotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJdG9vbGtpdC5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0uZ2V0Rm9ybSgpKTsKLQkJZm9ybS5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZVRpdGxlKTsKLQkJZm9ybS5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUikpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29sdW1uQ29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm0uZ2V0Qm9keSgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCS8vbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL2xheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJLy8gbGVmdCBjb2x1bW4KLQkJQ29tcG9zaXRlIGxlZnRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxlZnRDb2x1bW5Db21wLnNldExheW91dChsYXlvdXQpOwotCQlsZWZ0Q29sdW1uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQljcmVhdGVHZW5lcmFsU2VjdGlvbihsZWZ0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCQotCQlpbnNlcnRTZWN0aW9ucyhsZWZ0Q29sdW1uQ29tcCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQiKTsKLQkJCi0JCS8vIHJpZ2h0IGNvbHVtbgotCQlDb21wb3NpdGUgcmlnaHRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJpZ2h0Q29sdW1uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmlnaHRDb2x1bW5Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWNyZWF0ZVB1Ymxpc2hTZWN0aW9uKHJpZ2h0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCWNyZWF0ZVRpbWVvdXRTZWN0aW9uKHJpZ2h0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCQotCQlpbnNlcnRTZWN0aW9ucyhyaWdodENvbHVtbkNvbXAsICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIpOwotCQkKLQkJZm9ybS5yZWZsb3codHJ1ZSk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGxlZnRDb2x1bW5Db21wLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihsZWZ0Q29sdW1uQ29tcCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuRURJVE9SX09WRVJWSUVXX1BBR0UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJaW50IGRlY29yYXRpb25XaWR0aCA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7IAotCQkKLQkJLy8gc2VydmVyIG5hbWUKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZSk7Ci0JCQkKLQkJCXNlcnZlck5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOwotCQkJc2VydmVyTmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJc2VydmVyTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmICh1cGRhdGluZykKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJOYW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgc2VydmVyTmFtZS5nZXRUZXh0KCkpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKHNlcnZlck5hbWUsIENvbnRleHRJZHMuRURJVE9SX1NFUlZFUik7Ci0JCQkKLQkJCS8vIGhvc3RuYW1lCi0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWUpOwotCQkJCi0JCQlob3N0bmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsIHNlcnZlci5nZXRIb3N0KCkpOwotCQkJZmluYWwgQ29udHJvbERlY29yYXRpb24gaG9zdG5hbWVEZWNvcmF0aW9uID0gbmV3IENvbnRyb2xEZWNvcmF0aW9uKGhvc3RuYW1lLCBTV1QuVE9QIHwgU1dULkxFQUQpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBkZWNvcmF0aW9uV2lkdGg7Ci0JCQlob3N0bmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJaG9zdG5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVySG9zdG5hbWVDb21tYW5kKGdldFNlcnZlcigpLCBob3N0bmFtZS5nZXRUZXh0KCkpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKGhvc3RuYW1lLCBDb250ZXh0SWRzLkVESVRPUl9IT1NUTkFNRSk7Ci0JCQkKLQkJCUZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpOwotCQkJRmllbGREZWNvcmF0aW9uIGZkID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19DT05URU5UX1BST1BPU0FMKTsKLQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXRJbWFnZShmZC5nZXRJbWFnZSgpKTsKLQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQoZmQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlob3N0bmFtZURlY29yYXRpb24uaGlkZSgpOwotCQkJCi0JCQlob3N0bmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlob3N0bmFtZURlY29yYXRpb24uc2hvdygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJLy91cGRhdGVEZWNvcmF0aW9uKGhvc3RuYW1lRGVjb3JhdGlvbiwgbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgIlByZXNzIEN0cmwtU3BhY2UiKSk7Ci0JCQkKLQkJCUxpc3Q8U3RyaW5nPiBob3N0cyA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0SG9zdG5hbWVzKCk7Ci0JCQlTdHJpbmdbXSBob3N0czIgPSBob3N0cy50b0FycmF5KG5ldyBTdHJpbmdbaG9zdHMuc2l6ZSgpXSk7Ci0JCQluZXcgQXV0b0NvbXBsZXRlRmllbGQoaG9zdG5hbWUsIG5ldyBUZXh0Q29udGVudEFkYXB0ZXIoKSwgaG9zdHMyKTsKLQkJfQotCQkKLQkJLy8gcnVudGltZQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzUnVudGltZSgpKSB7Ci0JCQlmaW5hbCBJUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCWlmIChTZXJ2ZXJVSVBsdWdpbi5oYXNXaXphcmRGcmFnbWVudChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQlIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSHlwZXJsaW5rKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lLCBTV1QuTk9ORSk7Ci0JCQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJCQllZGl0UnVudGltZShydW50aW1lKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBlbHNlCi0JCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWUpOwotCQkJCi0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJCQotCQkJcnVudGltZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBkZWNvcmF0aW9uV2lkdGg7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXJ1bnRpbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJdXBkYXRlUnVudGltZUNvbWJvKCk7Ci0JCQkKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJfQotCQkJCi0JCQlydW50aW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICh1cGRhdGluZykKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCQlJUnVudGltZSBuZXdSdW50aW1lID0gcnVudGltZXNbcnVudGltZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyUnVudGltZUNvbW1hbmQoZ2V0U2VydmVyKCksIG5ld1J1bnRpbWUpKTsKLQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChydW50aW1lQ29tYm8sIENvbnRleHRJZHMuRURJVE9SX1JVTlRJTUUpOwotCQkJCi0JCQkvLyBhZGQgcnVudGltZSBsaXN0ZW5lcgotCQkJcnVudGltZUxpc3RlbmVyID0gbmV3IElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoZmluYWwgSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJCQkJLy8gbWF5IGJlIG5hbWUgY2hhbmdlIG9mIGN1cnJlbnQgcnVudGltZQotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHJ1bnRpbWUyLmVxdWFscyhnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyUnVudGltZUNvbW1hbmQoZ2V0U2VydmVyKCksIHJ1bnRpbWUyKSk7Ci0JCQkJCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCAmJiAhcnVudGltZUNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWludCBzaXplMiA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVBZGRlZChmaW5hbCBJUnVudGltZSBydW50aW1lMikgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHJ1bnRpbWVDb21ibyAhPSBudWxsICYmICFydW50aW1lQ29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibygpOwotCQkJCQkJCQkKLQkJCQkJCQkJaW50IHNpemUyID0gcnVudGltZXMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCQkJCQkJcnVudGltZUNvbWJvLnNlbGVjdChpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCAmJiAhcnVudGltZUNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWludCBzaXplMiA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCVNlcnZlckNvcmUuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8vIHNlcnZlciBjb25maWd1cmF0aW9uIHBhdGgKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoKTsKLQkJCQotCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciA9PSBudWxsKQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOwotCQkJZWxzZQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiArIHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOwotCQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJd2hzLnNldEhlbHAoc2VydmVyQ29uZmlndXJhdGlvbiwgQ29udGV4dElkcy5FRElUT1JfQ09ORklHVVJBVElPTik7Ci0JCQkKLQkJCWZpbmFsIElGb2xkZXIgY3VycmVudEZvbGRlciA9IHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlicm93c2UgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coc2VydmVyQ29uZmlndXJhdGlvbi5nZXRTaGVsbCgpLAotCQkJCQkJY3VycmVudEZvbGRlciwgdHJ1ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlTWVzc2FnZSk7Ci0JCQkJCWRpYWxvZy5zaG93Q2xvc2VkUHJvamVjdHMoZmFsc2UpOwotCQkJCQkKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPT0gMSkgewotCQkJCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHJlc3VsdFswXTsKLQkJCQkJCQkKLQkJCQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQkJCUlGb2xkZXIgZm9sZGVyMiA9IChJRm9sZGVyKSByZXNvdXJjZTsKLQkJCQkJCQkKLQkJCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kKGdldFNlcnZlcigpLCBmb2xkZXIyKSk7Ci0JCQkJCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0VGV4dChmb2xkZXIyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlicm93c2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlpZiAoc2VydmVyVHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpIHx8IHNlcnZlclR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpCi0JCQkJCXx8IHNlcnZlclR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkpIHsKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoVHlwZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoKTsKLQkJCQlpZiAobGF1bmNoVHlwZSAhPSBudWxsICYmIGxhdW5jaFR5cGUuaXNQdWJsaWMoKSkgewotCQkJCQlmaW5hbCBIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSHlwZXJsaW5rKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbiwgU1dULk5PTkUpOwotCQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSAoKFNlcnZlcikgZ2V0U2VydmVyKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCQkJCQkJCS8vIFRPRE86IHVzZSBjb3JyZWN0IGxhdW5jaCBncm91cAotCQkJCQkJCQlEZWJ1Z1VJVG9vbHMub3BlbkxhdW5jaENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzRGlhbG9nKGxpbmsuZ2V0U2hlbGwoKSwgbGF1bmNoQ29uZmlnLCAib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoR3JvdXAucnVuIik7Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIiwgY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHVibGlzaFNlY3Rpb24oQ29tcG9zaXRlIHJpZ2h0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocmlnaHRDb2x1bW5Db21wLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5FRElUT1JfT1ZFUlZJRVdfUEFHRSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLwkgYXV0by1wdWJsaXNoCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCWludCBwdWJsaXNoU2V0dGluZyA9IHN2ci5nZXRBdXRvUHVibGlzaFNldHRpbmcoKTsKLQkJCQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwkJCQkJCQkJCQkJCQkJCQotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGlzYWJsZSwgU1dULlJBRElPKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhdXRvUHVibGlzaERpc2FibGUuc2V0U2VsZWN0aW9uKHB1Ymxpc2hTZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSk7Ci0JCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaERpc2FibGUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0RJU0FCTEUpOwotCQkJCi0JCQlhdXRvUHVibGlzaEVuYWJsZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWQsIFNXVC5SQURJTyk7Ci0JCQlhdXRvUHVibGlzaEVuYWJsZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9FTkFCTEUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlhdXRvUHVibGlzaEVuYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJd2hzLnNldEhlbHAoYXV0b1B1Ymxpc2hFbmFibGUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0VOQUJMRSk7Ci0JCQkKLQkJCWZpbmFsIExhYmVsIGF1dG9QdWJsaXNoVGltZUxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCxjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hFbmFibGVkSW50ZXJ2YWwpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaEVuYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoVGltZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0TWluaW11bSgwKTsKLQkJCWF1dG9QdWJsaXNoVGltZS5zZXRJbmNyZW1lbnQoNSk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0TWF4aW11bSgxMjApOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldFNlbGVjdGlvbihzdnIuZ2V0QXV0b1B1Ymxpc2hUaW1lKCkpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChhdXRvUHVibGlzaEVuYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKGF1dG9QdWJsaXNoVGltZSk7Ci0JCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaFRpbWUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0VOQUJMRSk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoRW5hYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nIHx8ICFhdXRvUHVibGlzaEVuYWJsZS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kKGdldFNlcnZlcigpLCBTZXJ2ZXIuQVVUT19QVUJMSVNIX0VOQUJMRSkpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hFbmFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCQkJCi0JCQlhdXRvUHVibGlzaERpc2FibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcgfHwgIWF1dG9QdWJsaXNoRGlzYWJsZS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kKGdldFNlcnZlcigpLCBTZXJ2ZXIuQVVUT19QVUJMSVNIX0RJU0FCTEUpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaEVuYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKGF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hUaW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQoZ2V0U2VydmVyKCksIGF1dG9QdWJsaXNoVGltZS5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKGF1dG9QdWJsaXNoVGltZSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCS8vIHB1Ymxpc2hlcnMKLQkJCVB1Ymxpc2hlcltdIHB1YnMgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldEFsbFB1Ymxpc2hlcnMoKTsKLQkJCWlmIChwdWJzICE9IG51bGwgJiYgcHVicy5sZW5ndGggPiAwKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoZXJzKTsKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkKLQkJCQlwdWJsaXNoZXJzVGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkNIRUNLKTsKLQkJCQlwdWJsaXNoZXJzVGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCQkJcHVibGlzaGVyc1RhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCQkJd2hzLnNldEhlbHAocHVibGlzaGVyc1RhYmxlLCBDb250ZXh0SWRzLkVESVRPUl9QVUJMSVNIVEFTS1NfQ09ORklHVVJBVElPTik7Ci0JCQkJCi0JCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCQlwdWJsaXNoZXJzVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkKLQkJCQlwdWJsaXNoZXJzVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIocHVibGlzaGVyc1RhYmxlKTsKLQkJCQlwdWJsaXNoZXJzVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSJ9KTsKLQkJCQlwdWJsaXNoZXJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHVibGlzaGVyQ29udGVudFByb3ZpZGVyKHB1YnMpKTsKLQkJCQlwdWJsaXNoZXJzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFB1Ymxpc2hMYWJlbFByb3ZpZGVyKCkpOwotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCQkKLQkJCQlQdWJsaXNoZXJbXSBwdWJzMiA9ICgoU2VydmVyKXNlcnZlcikuZ2V0RW5hYmxlZFB1Ymxpc2hlcnMoKTsKLQkJCQlmb3IgKFB1Ymxpc2hlciBwIDogcHViczIpCi0JCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q2hlY2tlZChwLCB0cnVlKTsKLQkJCQkKLQkJCQlwdWJsaXNoZXJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIFB1Ymxpc2hlcikpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJCWV4ZWN1dGUobmV3IFNldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kKGdldFNlcnZlcigpLCAoUHVibGlzaGVyKSBlbGVtZW50LCBldmVudC5nZXRDaGVja2VkKCkpKTsKLQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRpbWVvdXRTZWN0aW9uKENvbXBvc2l0ZSByaWdodENvbHVtbkNvbXAsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHJpZ2h0Q29sdW1uQ29tcCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5GT0NVU19USVRMRSk7Ci0JCXNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRTZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXREZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5FRElUT1JfT1ZFUlZJRVdfUEFHRSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLwkgdGltZW91dHMKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlmaW5hbCBTZXJ2ZXIgc3ZyID0gKFNlcnZlcikgc2VydmVyOwotCQkJCi0JCQkvLyBzdGFydCB0aW1lb3V0IGxhYmVsCi0JCQlmaW5hbCBMYWJlbCBzdGFydFRpbWVvdXRMYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTdGFydFRpbWVvdXQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCQlzdGFydFRpbWVvdXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCQotCQkJCi0JCQlzdGFydFRpbWVvdXRTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0TWF4aW11bSg2MCozMCk7IC8vIDMwIG1pbnV0ZXMKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0SW5jcmVtZW50KDUpOwotCQkJc3RhcnRUaW1lb3V0U3Bpbm5lci5zZXRTZWxlY3Rpb24oc3ZyLmdldFN0YXJ0VGltZW91dCgpKTsKLQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoc3RhcnRUaW1lb3V0U3Bpbm5lcik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzA7Ci0JCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aHMuc2V0SGVscChzdGFydFRpbWVvdXRTcGlubmVyLCBDb250ZXh0SWRzLkVESVRPUl9USU1FT1VUX1NUQVJUKTsKLQkJCQotCQkJLy8gc3RvcCB0aW1lb3V0IGxhYmVsCi0JCQlmaW5hbCBMYWJlbCBzdG9wVGltZW91dExhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1N0b3BUaW1lb3V0KTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQkJc3RvcFRpbWVvdXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCQotCQkJCi0JCQlzdG9wVGltZW91dFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzdG9wVGltZW91dFNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRNYXhpbXVtKDYwKjMwKTsgLy8gMzAgbWludXRlcwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldEluY3JlbWVudCg1KTsKLQkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRTZWxlY3Rpb24oc3ZyLmdldFN0b3BUaW1lb3V0KCkpOwotCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aHMuc2V0SGVscChzdG9wVGltZW91dFNwaW5uZXIsIENvbnRleHRJZHMuRURJVE9SX1RJTUVPVVRfU1RPUCk7Ci0JCQkKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZChnZXRTZXJ2ZXIoKSwgc3RhcnRUaW1lb3V0U3Bpbm5lci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKHN0YXJ0VGltZW91dFNwaW5uZXIpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kKGdldFNlcnZlcigpLCBzdG9wVGltZW91dFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQl2YWxpZGF0ZSgpOwkJCQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJaWYgKHNob3dXaXphcmQocnVudGltZVdvcmtpbmdDb3B5KSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQl0cnkgewotCQkJCXJ1bnRpbWVXb3JraW5nQ29weS5zYXZlKGZhbHNlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzaG93V2l6YXJkKGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLndpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVXb3JraW5nQ29weS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQlpZiAoZnJhZ21lbnQyID09IG51bGwpCi0JCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZVdvcmtpbmdDb3B5KTsKLQotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChmcmFnbWVudDIpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJfQotCQl9OwotCQkKLQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZCh0aXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oKSB7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKTsKLQkJcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCQotCQlpZiAoU29ja2V0VXRpbC5pc0xvY2FsaG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKSAmJiBydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlMaXN0PElSdW50aW1lPiBydW50aW1lczIgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gcnVudGltZXNbaV07Ci0JCQkJaWYgKCFydW50aW1lMi5pc1N0dWIoKSkKLQkJCQkJcnVudGltZXMyLmFkZChydW50aW1lMik7Ci0JCQl9Ci0JCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVtydW50aW1lczIuc2l6ZSgpXTsKLQkJCXJ1bnRpbWVzMi50b0FycmF5KHJ1bnRpbWVzKTsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKLQkJCi0JCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWlmIChydW50aW1lTGlzdGVuZXIgIT0gbnVsbCkKLQkJCVNlcnZlckNvcmUucmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7Ci0JCQotCQlpZiAobWFuYWdlZEZvcm0gIT0gbnVsbCkgewotCQkJbWFuYWdlZEZvcm0uZGlzcG9zZSgpOwotCQkJbWFuYWdlZEZvcm0gPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChzZXJ2ZXJOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJZWxzZQotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkKLQkJCWhvc3RuYW1lLnNldFRleHQoc2VydmVyLmdldEhvc3QoKSk7Ci0JCQlpZiAocmVhZE9ubHkpCi0JCQkJaG9zdG5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJZWxzZQotCQkJCWhvc3RuYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCi0JCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQlJUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCX0KLQkJCQlpZiAocmVhZE9ubHkpCi0JCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQllbHNlCi0JCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJCi0JCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChmb2xkZXIgPT0gbnVsbCkKLQkJCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7Ci0JCQkJZWxzZQotCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldFRleHQoIiIgKyBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLmdldEZ1bGxQYXRoKCkpOwotCQkJCWlmIChyZWFkT25seSkgewotCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQkJYnJvd3NlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJCWJyb3dzZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCWludCBwdWJsaXNoU2V0dGluZyA9IHN2ci5nZXRBdXRvUHVibGlzaFNldHRpbmcoKTsKLQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKTsKLQkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldFNlbGVjdGlvbihwdWJsaXNoU2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0VOQUJMRSk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKHN2ci5nZXRBdXRvUHVibGlzaFRpbWUoKSk7Ci0JCQkKLQkJCWlmIChyZWFkT25seSkgewotCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlhdXRvUHVibGlzaEVuYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9FTkFCTEUpOwotCQkJfQotCQl9Ci0JCQotCQl1cGRhdGluZyA9IGZhbHNlOwotCQl2YWxpZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlJTWFuYWdlZEZvcm0gbUZvcm0gPSBnZXRNYW5hZ2VkRm9ybSgpOwotCQlpZiAobUZvcm0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCW1Gb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZSgibmFtZSIsIHNlcnZlck5hbWUpOwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHNlcnZlciwgc2VydmVyTmFtZS5nZXRUZXh0KCkudHJpbSgpKSkKLQkJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIm5hbWUiLCBNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZU5hbWUsIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHNlcnZlck5hbWUpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UoImNvbmZpZyIsIHNlcnZlckNvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChmb2xkZXIgPT0gbnVsbCB8fCAhZm9sZGVyLmV4aXN0cygpKQotCQkJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoImNvbmZpZyIsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0NvbmZpZ3VyYXRpb24sIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHNlcnZlckNvbmZpZ3VyYXRpb24pOwotCQkJfQotCQl9Ci0JCQotCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlY29yYXRpb24oQ29udHJvbERlY29yYXRpb24gZGVjb3JhdGlvbiwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlJbWFnZSBuZXdJbWFnZSA9IG51bGw7Ci0JCQlGaWVsZERlY29yYXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKLQkJCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQkJLy9uZXdJbWFnZSA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfSU5GT1JNQVRJT04pLmdldEltYWdlKCk7Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19SRVFVSVJFRCkuZ2V0SW1hZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19XQVJOSU5HKS5nZXRJbWFnZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuRVJST1I6Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLQkJCX0KLQkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJZGVjb3JhdGlvbi5zZXRJbWFnZShuZXdJbWFnZSk7Ci0JCQlkZWNvcmF0aW9uLnNob3coKTsKLQkJfSBlbHNlIHsKLQkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KG51bGwpOwotCQkJZGVjb3JhdGlvbi5oaWRlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKQotCQkJc2VydmVyTmFtZS5zZXRGb2N1cygpOwotCQllbHNlIGlmIChzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEZvY3VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YThjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci0vKioKLSAqIEEgbXVsdGktcGFnZSBzZXJ2ZXIgcmVzb3VyY2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0JLyoqCi0JICogSW50ZXJuYWwgcGFydCBhbmQgc2hlbGwgYWN0aXZhdGlvbiBsaXN0ZW5lcgotCSAqLwotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBleHRlbmRzIFNoZWxsQWRhcHRlciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIgewotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gcGFydDsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQkJaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbikKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChmQWN0aXZlUGFydCA9PSBTZXJ2ZXJFZGl0b3IudGhpcykgewotCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJY2hlY2tSZXNvdXJjZVN0YXRlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIG9sZFNlcnZlcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBvbGRTZXJ2ZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgb2xkU2VydmVyKSB7Ci0JCQlpZiAob2xkU2VydmVyLmVxdWFscyhzZXJ2ZXIpICYmICFpc0RpcnR5KCkpCi0JCQkJY2xvc2VFZGl0b3IoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVySWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJOYW1lOwotCi0JcHJvdGVjdGVkIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiB1bmRvQWN0aW9uOwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZG9BY3Rpb247Ci0KLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBjdXRBY3Rpb247Ci0JcHJvdGVjdGVkIFRleHRBY3Rpb24gY29weUFjdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBwYXN0ZUFjdGlvbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZ0FjdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbltdIGVkaXRvckFjdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Q8SUVkaXRvclBhcnQ+IHNlcnZlclBhZ2VzOwotCi0JLy8gb24gZm9jdXMgY2hhbmdlIGZsYWcKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZURlbGV0ZWQ7Ci0KLQkvLyBpbnB1dCBnaXZlbiB0byB0aGUgY29udGFpbmVkIHBhZ2VzCi0JcHJvdGVjdGVkIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgZWRpdG9yUGFydElucHV0OwotCi0JLy8gc3RhdHVzIGxpbmUgYW5kIHN0YXR1cwotCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzOwotCXByb3RlY3RlZCBTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBzdGF0dXNJdGVtOwotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgYWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcigpOwotCXByb3RlY3RlZCBMaWZlY3ljbGVMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyOwotCi0JLy8gdXNlZCBmb3IgZGlzYWJsaW5nIHJlc291cmNlIGNoYW5nZSBjaGVjayB3aGVuIHNhdmluZyB0aHJvdWdoIGVkaXRvcgotCXByb3RlY3RlZCBib29sZWFuIGlzU2F2aW5nID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTWFwPElFZGl0b3JQYXJ0LCBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+IHBhZ2VUb0ZhY3RvcnkgPSBuZXcgSGFzaE1hcDxJRWRpdG9yUGFydCwgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5PigpOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCi0JCXVuZG9BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkudW5kbyhzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCX07Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCS8vdW5kb0FjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ET19IT1ZFUikpOwotCQkvL3VuZG9BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE9fRElTQUJMRUQpKTsKLQkJCi0JCXJlZG9BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkucmVkbyhzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCX07Ci0JCXJlZG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCS8vcmVkb0FjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVET19IT1ZFUikpOwotCQkvL3JlZG9BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE9fRElTQUJMRUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgZWRpdG9yIGNvcnJlY3RseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZUVkaXRvcigpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRFZGl0b3JTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFNlcnZlckVkaXRvci50aGlzLCBmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCUxpc3Q8SUFjdGlvbj4gYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKLQkJCi0JCS8vIGFkZCBzZXJ2ZXIgYWN0aW9ucwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IFNlcnZlckVkaXRvckNvcmUuZ2V0U2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yaWVzKCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBpZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IGZhY3RvcnkgPSAoU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmYWN0b3J5LnN1cHBvcnRzU2VydmVyRWxlbWVudFR5cGUoaWQpICYmIGZhY3Rvcnkuc2hvdWxkRGlzcGxheShzZXJ2ZXIpKQotCQkJCQlhY3Rpb25MaXN0LmFkZChmYWN0b3J5LmNyZWF0ZUFjdGlvbihnZXRFZGl0b3JTaXRlKCksIGVkaXRvclBhcnRJbnB1dCkpOwotCQkJfQotCQl9Ci0KLQkJZWRpdG9yQWN0aW9ucyA9IG5ldyBJQWN0aW9uW2FjdGlvbkxpc3Quc2l6ZSgpXTsKLQkJYWN0aW9uTGlzdC50b0FycmF5KGVkaXRvckFjdGlvbnMpOwotCX0KLQotCXB1YmxpYyBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgZ2V0UGFnZUZhY3RvcnkoU2VydmVyRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGFnZVRvRmFjdG9yeS5nZXQocGFydCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgb2YgPGNvZGU+TXVsdGlQYWdlRWRpdG9yPC9jb2RlPiBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJc2VydmVyUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOwotCQkJCi0JCQkvLyBhZGQgZWRpdG9yIHBhZ2VzCi0JCQlpbnQgcGFnZUNvdW50ID0gMDsKLQkJCQotCQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IG51bGw7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotCQkJCXNlcnZlclR5cGVJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBTZXJ2ZXJFZGl0b3JDb3JlLmdldFNlcnZlckVkaXRvclBhZ2VGYWN0b3JpZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gKElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmYWN0b3J5LnN1cHBvcnRzVHlwZShzZXJ2ZXJUeXBlSWQpICYmIGZhY3Rvcnkuc2hvdWxkQ3JlYXRlUGFnZShzZXJ2ZXIpKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkFkZGluZyBwYWdlOiAiICsgZmFjdG9yeS5nZXRJZCgpICsgIiAiICsgZWRpdG9yUGFydElucHV0KTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhZ2UgPSBmYWN0b3J5LmNyZWF0ZVBhZ2UoKTsKLQkJCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYWdlVG9GYWN0b3J5LnB1dChwYWdlLCBmYWN0b3J5KTsKLQkJCQkJCQlpbmRleCA9IGFkZFBhZ2UocGFnZSwgZWRpdG9yUGFydElucHV0KTsKLQkJCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgZmFjdG9yeS5nZXROYW1lKCkpOwotCQkJCQkJCQotCQkJCQkJCXNlcnZlclBhZ2VzLmFkZChwYWdlKTsKLQkJCQkJCi0JCQkJCQkJcGFnZUNvdW50ICsrOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGRpc3BsYXkgZWRpdG9yIHBhZ2UgIiArIGZhY3RvcnkuZ2V0SWQoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChwYWdlQ291bnQgPiAwKQotCQkJCXNldEFjdGl2ZVBhZ2UoMCk7Ci0JCQkKLQkJCS8vIHJlZ2lzdGVyIGZvciBldmVudHMgdGhhdCBtaWdodCBjaGFuZ2UgdGhlIGN1dC9jb3B5L3Bhc3RlIGFjdGlvbnMKLQkJCWludCBjb3VudCA9IGdldFBhZ2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbChpKTsKLQkJCQlyZWdpc3RlckV2ZW50cyhjb250cm9sKTsKLQkJCX0KLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciBlZGl0b3IgcGFnZXMiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCQl3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJCVNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJCWFjdGl2YXRpb25MaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChyZXNvdXJjZUxpc3RlbmVyICE9IG51bGwpCi0JCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIpOwotCQkKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCAmJiAhc2VydmVyLmdldE5hbWUoKS5lcXVhbHMoc2VydmVyTmFtZSkpIHsKLQkJCS8vIG9ubHkgcHJvbXB0IGlmIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIHdvcmtzcGFjZSBvciB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpICE9IG51bGwgfHwgKChTZXJ2ZXIpc2VydmVyKS5nZXRGaWxlKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclNlcnZlckVkaXRvcjsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlbmFtZUZpbGVzOwotCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsICBtZXNzYWdlKSkKLQkJCQkJdHJ5IHsKLQkJCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyKS5yZW5hbWVGaWxlcyhudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbmFtaW5nIHNlcnZlciIsIGUpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWNvbW1hbmRNYW5hZ2VyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCi0JCQlpZiAoc2VydmVySWQgIT0gbnVsbCkKLQkJCQljb21tYW5kTWFuYWdlci5yZWxlYXNlQ29tbWFuZE1hbmFnZXIoc2VydmVySWQpOwotCQkJCi0JCQljb21tYW5kTWFuYWdlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLQkgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotCSAqIDwvcD4KLQkgKgotCSAqIEBzZWUgSUVkaXRvclBhcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIHNldCB0aGUgaXNTYXZpbmcgZmxhZyB0byB0cnVlCi0JCWlzU2F2aW5nID0gdHJ1ZTsKLQkJCi0JCS8vIGNoZWNrIHBhZ2VzIGZvciBlcnJvcnMgZmlyc3QKLQkJamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJQYWdlcy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQlpbnQgbWF4U2V2ZXJpdHkgPSAtMTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUVkaXRvclBhcnQgcGFydCA9IChJRWRpdG9yUGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3JQYXJ0KSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXR1czIgPSAoKFNlcnZlckVkaXRvclBhcnQpIHBhcnQpLmdldFNhdmVTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzMiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gc3RhdHVzMi5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQllcnJvcnMuYWRkKCJbIiArIGdldFBhZ2VUZXh0KGNvdW50KSArICJdICIgKyBzdGF0dXMyW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQltYXhTZXZlcml0eSA9IE1hdGgubWF4KG1heFNldmVyaXR5LCBzdGF0dXMyW2ldLmdldFNldmVyaXR5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY291bnQgKys7Ci0JCX0KLQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpICYmIG1heFNldmVyaXR5ID4gSVN0YXR1cy5PSykgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKE1lc3NhZ2VzLmVycm9yRWRpdG9yQ2FudFNhdmUgKyAiXG4iKTsKLQkJCWl0ZXJhdG9yID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCXNiLmFwcGVuZCgiXHQiICsgKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkgKyAiXG4iKTsKLQkJCQotCQkJaWYgKG1heFNldmVyaXR5ID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0UGFydE5hbWUoKSwgc2IudG9TdHJpbmcoKSk7Ci0JCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQkvLyByZXNldCB0aGUgaXNTYXZpbmcgZmxhZwotCQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChtYXhTZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0UGFydE5hbWUoKSwgc2IudG9TdHJpbmcoKSk7Ci0JCQllbHNlIC8vIGlmIChtYXhTZXZlcml0eSA9PSBJU3RhdHVzLklORk8pCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGdldFBhcnROYW1lKCksIHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJaW50IHRpY2tzID0gMjAwMDsKLQkJCVN0cmluZyBuYW1lID0gIiI7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJbmFtZSA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5zYXZpbmdUYXNrLCBuYW1lKSwgdGlja3MpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXRpY2tzIC89IDI7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgIHsKLQkJCQlzZXJ2ZXIuc2F2ZShmYWxzZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgdGlja3MpKTsKLQkJCQlnZXRDb21tYW5kTWFuYWdlcigpLnJlc291cmNlU2F2ZWQoc2VydmVySWQpOwotCQkJCWNvbW1hbmRNYW5hZ2VyLnVwZGF0ZVRpbWVzdGFtcHMoc2VydmVySWQpOwotCQkJfQotCQkJCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlzZXRQYXJ0TmFtZShsYWJlbFByb3ZpZGVyLmdldFRleHQoc2VydmVyKSk7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNhdmluZyBzZXJ2ZXIgZWRpdG9yIiwgZSk7Ci0JCQkKLQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkKLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclNhdmVFcnJvckRpYWxvZzsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yU2F2ZUVycm9yTWVzc2FnZSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCAgbWVzc2FnZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQkvLyByZXNldCB0aGUgaXNTYXZpbmcgZmxhZwotCQlpc1NhdmluZyA9IGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IgdG8gYW5vdGhlciBvYmplY3QuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHNlZSBJRWRpdG9yUGFydAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBpIGEgcHJvcGVydHkgY2hhbmdlIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBpKSB7Ci0JCWlmIChpID09IFNlcnZlckVkaXRvclBhcnQuUFJPUF9FUlJPUikKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGdsb2JhbCBjb21tYW5kIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ2xvYmFsIGNvbW1hbmQgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVkbyBhY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRSZWRvQWN0aW9uKCkgewotCQlyZXR1cm4gcmVkb0FjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZG8gYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0VW5kb0FjdGlvbigpIHsKLQkJcmV0dXJuIHVuZG9BY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFNldHMgdGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uIHN0YXRlIGZvciB0aGlzIGVkaXRvciB0byB0aGUgcGFzc2FnZSBkZWZpbmVkCi0JICogYnkgdGhlIGdpdmVuIG1hcmtlci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjdXQsIGNvcHksIGFuZCBwYXN0ZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbnNJbXBsKCkgewotCQlpZiAodXBkYXRpbmdBY3Rpb25zKQotCQkJcmV0dXJuOwotCQkKLQkJdXBkYXRpbmdBY3Rpb25zID0gdHJ1ZTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl1cGRhdGluZ0FjdGlvbnMgPSBmYWxzZTsKLQkJCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgY3V0LCBjb3B5LCBhbmQgcGFzdGUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25zKCkgewotCQljdXRBY3Rpb24udXBkYXRlKCk7Ci0JCWNvcHlBY3Rpb24udXBkYXRlKCk7Ci0JCXBhc3RlQWN0aW9uLnVwZGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGN1dCwgY29weSwgYW5kIHBhc3RlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1c0l0ZW0gIT0gbnVsbCkgewotCQkJYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCXJlYWRPbmx5ID0gdHJ1ZTsKLQkJCQotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXN0YXR1c0l0ZW0uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JSZWFkT25seSk7Ci0JCQllbHNlCi0JCQkJc3RhdHVzSXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvcldyaXRhYmxlKTsKLQkJfQotCi0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhzZXJ2ZXJJZCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWZpcnN0KQotCQkJCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJCQlzYi5hcHBlbmQoZmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKmlmIChzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhzZXJ2ZXJDb25maWd1cmF0aW9uSWQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFmaXJzdCkKLQkJCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCQkJc2IuYXBwZW5kKGZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSovCi0JCQlpZiAoc2IubGVuZ3RoKCkgPiAxKQotCQkJCXN0YXR1cy5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclJlYWRPbmx5RmlsZXMsIHNiLnRvU3RyaW5nKCkpKTsKLQkJCWVsc2UKLQkJCQlzdGF0dXMuc2V0TWVzc2FnZSgiIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0dXNFcnJvcigpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIGVycm9yID0gbnVsbDsKLQkJSUVkaXRvclBhcnQgcGFydCA9IGdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpCi0JCQllcnJvciA9ICgoU2VydmVyRWRpdG9yUGFydCkgcGFydCkuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlclBhZ2VzLml0ZXJhdG9yKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlIChlcnJvciA9PSBudWxsICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcGFydCA9IChJRWRpdG9yUGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3JQYXJ0KSB7Ci0JCQkJZXJyb3IgPSAoKFNlcnZlckVkaXRvclBhcnQpIHBhcnQpLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJvciAhPSBudWxsKQotCQkJCQllcnJvciA9ICJbIiArIGdldFBhZ2VUZXh0KGNvdW50KSArICJdICIgKyBlcnJvcjsKLQkJCX0KLQkJCWNvdW50ICsrOwotCQl9Ci0JCXN0YXR1cy5zZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMgbGluZSBtYW5hZ2VyCi0JICogQHBhcmFtIGl0ZW0gYSBzdGF0dXMgY29udHJpYnV0aW9uIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1cywgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJdGhpcy5zdGF0dXNJdGVtID0gaXRlbTsKLQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yIGtleSBhbmQgdHJhdmVyc2FsIGV2ZW50cyB0byBlbmFibGUvZGlzYWJsZSB0aGUgY3V0L2NvcHkvcGFzdGUgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckV2ZW50cyhDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCB8fCBjb250cm9sIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCS8vIHJlZ2lzdGVyIHRoZSB3b3JsZC4uLiBhbnkgb2YgdGhlc2UgYWN0aW9ucyBjb3VsZCBjYXVzZSB0aGUgc3RhdGUgdG8gY2hhbmdlCi0JCQljb250cm9sLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKLQkJCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9ICgoQ29tcG9zaXRlKWNvbnRyb2wpLmdldENoaWxkcmVuKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQlyZWdpc3RlckV2ZW50cyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPkVkaXRvclBhcnQ8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLiAgV2l0aGluCi0JICogdGhlIGltcGxlbWVudGF0aW9uIHN1YmNsYXNzZXMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCB0eXBlIGlzIGFjY2VwdGFibGUKLQkgKiBhbmQgdGhlbiBzYXZlIHRoZSBzaXRlIGFuZCBpbnB1dC4gIEhlcmUgaXMgc2FtcGxlIGNvZGU6Ci0JICogPC9wPgotCSAqIDxwcmU+Ci0JICoJCWlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0JICoJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCSAqCQlzZXRTaXRlKHNpdGUpOwotCSAqCQlzZXRJbnB1dChlZGl0b3JJbnB1dCk7Ci0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWNvbW1hbmRNYW5hZ2VyID0gR2xvYmFsQ29tbWFuZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IFNlcnZlclVJUGx1Z2luLmZpbmRTZXJ2ZXIoZmlsZSk7Ci0JCQkJaWYgKHNlcnZlcjIgIT0gbnVsbCkKLQkJCQkJc2VydmVySWQgPSBzZXJ2ZXIyLmdldElkKCk7Ci0JCQl9Ci0JCQlpZiAoc2VydmVySWQgPT0gbnVsbCkgewotCQkJCWlmIChmaWxlID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5lcnJvckVkaXRvciwgTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKSk7Ci0JCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRWRpdG9yLCBmaWxlLmdldE5hbWUoKSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVNlcnZlckVkaXRvcklucHV0KSB7Ci0JCQlJU2VydmVyRWRpdG9ySW5wdXQgc2VpID0gKElTZXJ2ZXJFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlzZXJ2ZXJJZCA9IHNlaS5nZXRTZXJ2ZXJJZCgpOwotCQl9Ci0KLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCWNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmRNYW5hZ2VyKHNlcnZlcklkKTsKLQkJCXNlcnZlciA9IGNvbW1hbmRNYW5hZ2VyLmdldFNlcnZlclJlc291cmNlKHNlcnZlcklkKTsKLQkJfQotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNldFBhcnROYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzZXJ2ZXIpKTsKLQkJCXNldFRpdGxlSW1hZ2UobGFiZWxQcm92aWRlci5nZXRJbWFnZShzZXJ2ZXIpKTsKLQkJCXNldFRpdGxlVG9vbFRpcChzZXJ2ZXJJZCk7Ci0JCQlzZXJ2ZXJOYW1lID0gc2VydmVyLmdldE5hbWUoKTsKLQkJfSBlbHNlCi0JCQlzZXRQYXJ0TmFtZSgiLSIpOwotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJbGFiZWxQcm92aWRlciA9IG51bGw7Ci0JCQotCQljdXRBY3Rpb24gPSBuZXcgVGV4dEFjdGlvbihzaXRlLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBUZXh0QWN0aW9uLkNVVF9BQ1RJT04pOwotCQljb3B5QWN0aW9uID0gbmV3IFRleHRBY3Rpb24oc2l0ZS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgVGV4dEFjdGlvbi5DT1BZX0FDVElPTik7Ci0JCXBhc3RlQWN0aW9uID0gbmV3IFRleHRBY3Rpb24oc2l0ZS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgVGV4dEFjdGlvbi5QQVNURV9BQ1RJT04pOwotCQkKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoR2xvYmFsQ29tbWFuZE1hbmFnZXIuUFJPUF9ESVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqID09IHNlcnZlcklkKQotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJCX0gZWxzZSBpZiAoR2xvYmFsQ29tbWFuZE1hbmFnZXIuUFJPUF9VTkRPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogPT0gc2VydmVySWQpCi0JCQkJCQl1cGRhdGVVbmRvQWN0aW9uKCk7Ci0JCQkJfSBlbHNlIGlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX1JFRE8uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkKLQkJCQkJCXVwZGF0ZVJlZG9BY3Rpb24oKTsKLQkJCQl9IGVsc2UgaWYgKEdsb2JhbENvbW1hbmRNYW5hZ2VyLlBST1BfUkVMT0FELmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogPT0gc2VydmVySWQpIHsKLQkJCQkJCXNlcnZlciA9IGNvbW1hbmRNYW5hZ2VyLmdldFNlcnZlclJlc291cmNlKHNlcnZlcklkKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoc2VydmVySWQpKQotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkKLQkJY29tbWFuZE1hbmFnZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvLyBjcmVhdGUgZWRpdG9yIGlucHV0Ci0JCVNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBudWxsOwotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXJDb21tYW5kTWFuYWdlciA9IG5ldyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyKHRoaXMsIHNlcnZlcklkLCBjb21tYW5kTWFuYWdlcik7Ci0JCWVkaXRvclBhcnRJbnB1dCA9IGNvbW1hbmRNYW5hZ2VyLmdldFBhcnRJbnB1dChzZXJ2ZXJJZCwgc2VydmVyQ29tbWFuZE1hbmFnZXIpOwotCQkKLQkJY3JlYXRlQWN0aW9ucygpOwotCQkKLQkJLy8gYWRkIHJlc291cmNlIGxpc3RlbmVyCi0JCXJlc291cmNlTGlzdGVuZXIgPSBuZXcgTGlmZWN5Y2xlTGlzdGVuZXIoKTsKLQkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQl3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJd2luZG93LmdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcihhY3RpdmF0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBzYXZlCi0JICogb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLQkgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotCSAqIDwvcD4KLQkgKgotCSAqIEBzZWUgSUVkaXRvclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoY29tbWFuZE1hbmFnZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoc2VydmVySWQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCi0JICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB1bmRvIGFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVbmRvQWN0aW9uKCkgewotCQlJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldFVuZG9Db21tYW5kKHNlcnZlcklkKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvclVuZG9EaXNhYmxlZCk7Ci0JCQl1bmRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KCIiKTsKLQkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oIiIpOwotCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yVW5kb0VuYWJsZWQsIG5ldyBPYmplY3RbXSB7Y29tbWFuZC5nZXRMYWJlbCgpfSk7Ci0JCQl1bmRvQWN0aW9uLnNldFRleHQodGV4dCk7Ci0JCQl1bmRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHJlZG8gYWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlZG9BY3Rpb24oKSB7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVkb0NvbW1hbmQoc2VydmVySWQpOwotCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZWRvQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuZWRpdG9yUmVkb0Rpc2FibGVkKTsKLQkJCXJlZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoIiIpOwotCQkJcmVkb0FjdGlvbi5zZXREZXNjcmlwdGlvbigiIik7Ci0JCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHRleHQgPSBOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JSZWRvRW5hYmxlZCwgbmV3IE9iamVjdFtdIHtjb21tYW5kLmdldExhYmVsKCl9KTsKLQkJCXJlZG9BY3Rpb24uc2V0VGV4dCh0ZXh0KTsKLQkJCXJlZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoY29tbWFuZC5nZXRMYWJlbCgpKTsKLQkJCXJlZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oY29tbWFuZC5nZXRMYWJlbCgpKTsKLQkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1dCBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldEN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIGN1dEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3B5IGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0Q29weUFjdGlvbigpIHsKLQkJcmV0dXJuIGNvcHlBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFzdGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRQYXN0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIHBhc3RlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0b3IgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb25bXSBnZXRFZGl0b3JBY3Rpb25zKCkgewotCQlyZXR1cm4gZWRpdG9yQWN0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzZXJ2ZXIgcGFnZXMgd2l0aCBuZXcgaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJLy8gY3JlYXRlIGVkaXRvciBpbnB1dAotCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBuZXcgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlcih0aGlzLCBzZXJ2ZXJJZCwgY29tbWFuZE1hbmFnZXIpOwotCQllZGl0b3JQYXJ0SW5wdXQgPSBjb21tYW5kTWFuYWdlci5nZXRQYXJ0SW5wdXQoc2VydmVySWQsIHNlcnZlckNvbW1hbmRNYW5hZ2VyKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyUGFnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUVkaXRvclBhcnQgcGFydCA9IChJRWRpdG9yUGFydCkgaXRlcmF0b3IubmV4dCgpOwkJCQkJCQotCQkJdHJ5IHsKLQkJCQlwYXJ0LmluaXQocGFydC5nZXRFZGl0b3JTaXRlKCksIGVkaXRvclBhcnRJbnB1dCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZnJlc2goKWluZyBlZGl0b3IgcGFydCIsIGUpOwotCQkJfQotCQl9CQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRSZWFkT25seVNlcnZlckZpbGUoU3RyaW5nIGlkKSB7Ci0JCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KGlkLCB0cnVlKTsKLQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlYWRPbmx5TWVzc2FnZTsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKFN0cmluZyBpZCkgewotCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JSZXNvdXJjZU1vZGlmaWVkVGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlOwotCQkKLQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSkpIHsKLQkJCS8qdHJ5IHsKLQkJCQkvL3djLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkvL1RPRE86IHJlZnJlc2ggbG9jYWwgc2VydmVyCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZnJlc2hpbmcgc2VydmVyIiwgZSk7Ci0JCQl9Ki8KLQkJCWNvbW1hbmRNYW5hZ2VyLnJlbG9hZChpZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1Jlc291cmNlU3RhdGUoKSB7Ci0JCS8vIGRvIG5vdCBjaGVjayB0aGUgcmVzb3VyY2Ugc3RhdGUgY2hhbmdlIGlmIHNhdmluZyB0aHJvdWdoIHRoZSBlZGl0b3IKLQkJaWYgKGlzU2F2aW5nKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIGZvciBkZWxldGVkIGZpbGVzCi0JCWlmIChyZXNvdXJjZURlbGV0ZWQpIHsKLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlVGl0bGU7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlU2F2ZSwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9MQUJFTH07Ci0JCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTiwgbGFiZWxzLCAwKTsKLQkJCQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gMCkKLQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQllbHNlCi0JCQkJY2xvc2VFZGl0b3IoKTsKLQkJCXJldHVybjsKLQkJfQotCQlyZXNvdXJjZURlbGV0ZWQgPSBmYWxzZTsKLQkJCi0JCS8vIGNoZWNrIGZvciBzZXJ2ZXIgY2hhbmdlcwotCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgewotCQkJaWYgKCFjb21tYW5kTWFuYWdlci5pc0RpcnR5KHNlcnZlcklkKSkgewotCQkJCWlmIChjb21tYW5kTWFuYWdlci5oYXNDaGFuZ2VkKHNlcnZlcklkKSkgewotCQkJCQlJU2VydmVyIG5ld1NlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCQkJCWlmIChuZXdTZXJ2ZXIgIT0gbnVsbCAmJiAoKFNlcnZlciluZXdTZXJ2ZXIpLmdldFRpbWVzdGFtcCgpID4gKChTZXJ2ZXIpc2VydmVyKS5nZXRUaW1lc3RhbXAoKSkKLQkJCQkJCWNvbW1hbmRNYW5hZ2VyLnJlbG9hZChzZXJ2ZXJJZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXByb21wdFJlbG9hZFNlcnZlckZpbGUoc2VydmVySWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmhhc0NoYW5nZWQoc2VydmVySWQpICYmICFjb21tYW5kTWFuYWdlci5hcmVGaWxlc1JlYWRPbmx5KHNlcnZlcklkKSkKLQkJCQkJcHJvbXB0UmVsb2FkU2VydmVyRmlsZShzZXJ2ZXJJZCk7Ci0JCQkJZWxzZSBpZiAoY29tbWFuZE1hbmFnZXIuYXJlRmlsZXNSZWFkT25seShzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCQlwcm9tcHRSZWFkT25seVNlcnZlckZpbGUoc2VydmVySWQpOwotCQkJfQotCQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpICYmICFjb21tYW5kTWFuYWdlci5hcmVGaWxlc1JlYWRPbmx5KHNlcnZlcklkKSkKLQkJCQljb21tYW5kTWFuYWdlci5zZXRSZWFkT25seShzZXJ2ZXJJZCwgZmFsc2UpOwotCQkJY29tbWFuZE1hbmFnZXIudXBkYXRlVGltZXN0YW1wcyhzZXJ2ZXJJZCk7Ci0JCX0KLQkJCi0JCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRpdGxlIHRvb2x0aXAuCi0JICogCi0JICogQHJldHVybiB0aGUgdGl0bGUgdG9vbHRpcAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGVUb29sVGlwKCkgewotCQlTZXJ2ZXIgc2VydmVyMiA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlcjIuZ2V0RmlsZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyMi5nZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQllbHNlIGlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gImVycm9yIjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCQlyZXR1cm4gV2luZG93LmdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRjOTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotLyoqCi0gKiBTZXJ2ZXIgZWRpdG9yIGFjdGlvbiBiYXIgY29udHJpYnV0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1NFUEFSQVRPUiA9ICJzZXJ2ZXItZWRpdG9yLWFkZGl0aW9ucyI7Ci0KLQkvLyBjdXJyZW50IGVkaXRvcgotCXByb3RlY3RlZCBTZXJ2ZXJFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvciBmb3IgdGhlIGNvbnRyaWJ1dG9yLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LiBUaGlzIGdlbmVyYWxseSBlbnRhaWxzIGRpc2Nvbm5lY3RpbmcKLQkgKiBmcm9tIHRoZSBvbGQgZWRpdG9yLCBjb25uZWN0aW5nIHRvIHRoZSBuZXcgZWRpdG9yLCBhbmQgdXBkYXRpbmcgdGhlIGFjdGlvbnMKLQkgKiB0byByZWZsZWN0IHRoZSBuZXcgZWRpdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0RWRpdG9yIHRoZSBuZXcgdGFyZ2V0IGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0KLQkJaWYgKHRhcmdldEVkaXRvciAhPSBudWxsICYmIHRhcmdldEVkaXRvci5lcXVhbHMoZWRpdG9yKSkKLQkJCXJldHVybjsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWJvb2xlYW4gYWN0aW9uQmFyc1VwZGF0ZWQgPSBmYWxzZTsKLQotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRTdGF0dXMobnVsbCwgbnVsbCk7Ci0JCQkKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlzdGF0dXMucmVtb3ZlQWxsKCk7Ci0KLQkJCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQl0Ym0ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCWFjdGlvbkJhcnNVcGRhdGVkID0gdHJ1ZTsKLQkJfQotCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChTZXJ2ZXJFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkVkaXRvciBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvcjogIiArIGVkaXRvcik7Ci0JCQllZGl0b3IudXBkYXRlVW5kb0FjdGlvbigpOwotCQkJZWRpdG9yLnVwZGF0ZVJlZG9BY3Rpb24oKTsKLQkJCQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCBlZGl0b3IuZ2V0VW5kb0FjdGlvbigpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwgZWRpdG9yLmdldFJlZG9BY3Rpb24oKSk7Ci0JCQkKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgZWRpdG9yLmdldENvcHlBY3Rpb24oKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgZWRpdG9yLmdldEN1dEFjdGlvbigpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIGVkaXRvci5nZXRQYXN0ZUFjdGlvbigpKTsKLQkJCQotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1cyA9IGFjdGlvbkJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCVN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGl0ZW0gPSBuZXcgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oImlkIik7Ci0JCQlzdGF0dXMuYWRkKGl0ZW0pOwotCi0JCQllZGl0b3Iuc2V0U3RhdHVzKHN0YXR1cywgaXRlbSk7Ci0JCQllZGl0b3IudXBkYXRlU3RhdHVzTGluZSgpOwotCi0JCQlJQWN0aW9uW10gYWN0aW9ucyA9IGVkaXRvci5nZXRFZGl0b3JBY3Rpb25zKCk7Ci0JCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKFNFUlZFUl9FRElUT1JfU0VQQVJBVE9SKSk7Ci0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBhY3Rpb25zLmxlbmd0aDsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdHRlbXB0aW5nIHRvIGFkZCBlZGl0b3IgYWN0aW9uczogIiArIHNpemUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImFjdGlvbjogIiArIGFjdGlvbnNbaV0pOwotCQkJCQl0Ym0uYXBwZW5kVG9Hcm91cChTRVJWRVJfRURJVE9SX1NFUEFSQVRPUiwgYWN0aW9uc1tpXSk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChtb2RpZmllZCkKLQkJCQl0Ym0udXBkYXRlKGZhbHNlKTsKLQkJCWFjdGlvbkJhcnNVcGRhdGVkID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQllZGl0b3IgPSBudWxsOwotCQkKLQkJaWYgKGFjdGlvbkJhcnNVcGRhdGVkKQotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE3ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLS8qKgotICogQSBkZWZhdWx0IHNlcnZlciB0aGF0IGNhbiBiZSBjcmVhdGVkIGZvciBhIHNldCBvZiBnaXZlbgotICogbmF0dXJlcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGVmYXVsdCBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGVmYXVsdCBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWRzIG9mIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgZmFjdG9yaWVzIChzcGVjaWZpZWQKLQkgKiB1c2luZyBKYXZhLWltcG9ydCBzdHlsZSkgdGhhdCB0aGlzIHBhZ2UgbWF5IHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQlsaXN0LmFkZChzdHIpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvckFjdGlvbkZhY3Rvcnkjc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmdbXSBzID0gZ2V0VHlwZUlkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGFjdGlvbiBmYWN0b3J5IGRlbGVnYXRlIiwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5I3Nob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuc2hvdWxkRGlzcGxheShzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSNjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpCi0JICovCi0JcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmNyZWF0ZUFjdGlvbihzaXRlLCBpbnB1dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2YzMGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25EZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yQ29yZSB7Ci0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIGVkaXRvciBmYWN0b3JpZXMgYW5kIGFjdGlvbnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PiBlZGl0b3JQYWdlRmFjdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIExpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PiBlZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGVkaXRvckFjdGlvbkZhY3RvcmllczsKLQotCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIGFsbCBlZGl0b3IgcGFnZSBmYWN0b3JpZXMKLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+IGdldFNlcnZlckVkaXRvclBhZ2VGYWN0b3JpZXMoKSB7Ci0JCWlmIChlZGl0b3JQYWdlRmFjdG9yaWVzID09IG51bGwpCi0JCQlsb2FkRWRpdG9yUGFnZUZhY3RvcmllcygpOwotCQlyZXR1cm4gZWRpdG9yUGFnZUZhY3RvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBhbGwgZWRpdG9yIHBhZ2Ugc2VjdGlvbiBmYWN0b3JpZXMKLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoKSB7Ci0JCWlmIChlZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCk7Ci0JCXJldHVybiBlZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBmYWN0b3J5IGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuZWRpdG9yUGFnZXMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIFNlcnZlclVJUGx1Z2luLkVYVEVOU0lPTl9FRElUT1JfUEFHRVMpOwotCQlMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4oY2YubGVuZ3RoKTsKLQkJbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoY2YsIGxpc3QpOwotCQllZGl0b3JQYWdlRmFjdG9yaWVzID0gbGlzdDsKLQkJU2VydmVyVUlQbHVnaW4uYWRkUmVnaXN0cnlMaXN0ZW5lcigpOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5lZGl0b3JQYWdlcyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIHBhZ2UgZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZUZhY3RvcmllcyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiwgTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlckVkaXRvclBhcnRGYWN0b3J5KGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgZWRpdG9yUGFnZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgZWRpdG9yUGFnZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgcGFnZXMKLQkJc29ydE9yZGVyZWRMaXN0KGxpc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVFZGl0b3JQYWdlRmFjdG9yaWVzRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChlZGl0b3JQYWdlRmFjdG9yaWVzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+KGVkaXRvclBhZ2VGYWN0b3JpZXMpOwotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkKLQkJCWxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKGNmLCBsaXN0KTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJU2VydmVyRWRpdG9yUGFydEZhY3RvcnlbXSBzZXBmID0gbmV3IFNlcnZlckVkaXRvclBhcnRGYWN0b3J5W3NpemVdOwotCQkJbGlzdC50b0FycmF5KHNlcGYpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAoc2VwZltpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlsaXN0LnJlbW92ZShzZXBmW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllZGl0b3JQYWdlRmFjdG9yaWVzID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuZWRpdG9yUGFnZVNlY3Rpb25zIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBTZXJ2ZXJVSVBsdWdpbi5FWFRFTlNJT05fRURJVE9SX1BBR0VfU0VDVElPTlMpOwotCQlMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PihjZi5sZW5ndGgpOwotCQlsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoY2YsIGxpc3QpOwotCQllZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9IGxpc3Q7Ci0JCVNlcnZlclVJUGx1Z2luLmFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuZWRpdG9yUGFnZVNlY3Rpb25zIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeShjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIGVkaXRvclBhZ2VTZWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBlZGl0b3JQYWdlU2VjdGlvbjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgc2VjdGlvbnMKLQkJc29ydE9yZGVyZWRMaXN0KGxpc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcmllc0RlbHRhKElFeHRlbnNpb25EZWx0YSBkZWx0YSkgewotCQlpZiAoZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKLQkJCXJldHVybjsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQlMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PihlZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcmllcyk7Ci0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKQotCQkJbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKGNmLCBsaXN0KTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5W10gc2VwcyA9IG5ldyBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnlbc2l6ZV07Ci0JCQlsaXN0LnRvQXJyYXkoc2Vwcyk7Ci0JCQlpbnQgc2l6ZTIgPSBjZi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCWlmIChzZXBzW2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKLQkJCQkJCWxpc3QucmVtb3ZlKHNlcHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBhbGwgZWRpdG9yIGFjdGlvbiBmYWN0b3JpZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcmllcygpIHsKLQkJaWYgKGVkaXRvckFjdGlvbkZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZEVkaXRvckFjdGlvbkZhY3RvcmllcygpOwotCQlyZXR1cm4gZWRpdG9yQWN0aW9uRmFjdG9yaWVzOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgYWN0aW9uIGZhY3RvcmllcyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yQWN0aW9uRmFjdG9yaWVzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuZWRpdG9yQWN0aW9ucyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgImVkaXRvckFjdGlvbnMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5PihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBlZGl0b3JBY3Rpb246ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIGVkaXRvckFjdGlvbjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgcGFnZXMKLQkJc29ydE9yZGVyZWRMaXN0KGxpc3QpOwotCQllZGl0b3JBY3Rpb25GYWN0b3JpZXMgPSBsaXN0OwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuZWRpdG9yQWN0aW9ucyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIGdpdmVuIGxpc3Qgb2YgSU9yZGVyZWQgaXRlbXMgaW50byBpbmRleGVkIG9yZGVyLiBUaGlzIG1ldGhvZAotCSAqIG1vZGlmaWVzIHRoZSBvcmlnaW5hbCBsaXN0LCBidXQgcmV0dXJucyB0aGUgdmFsdWUgZm9yIGNvbnZlbmllbmNlLgotCSAqCi0JICogQHBhcmFtIGxpc3QgamF2YS51dGlsLkxpc3QKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNvcnRPcmRlcmVkTGlzdChMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJSU9yZGVyZWQgYSA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaSk7Ci0JCQkJSU9yZGVyZWQgYiA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0T3JkZXIoKSA+IGIuZ2V0T3JkZXIoKSkgewotCQkJCQlJT3JkZXJlZCB0ZW1wID0gYTsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg2MWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0vKioKLSAqIFRoZSBlZGl0b3IgaW5wdXQgZm9yIHNlcnZlciBjb25maWd1cmF0aW9ucyBhbmQgaW5zdGFuY2VzLiBUaGUKLSAqIGlucHV0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgZWl0aGVyIGFuIGluc3RhbmNlIG9yCi0gKiBjb25maWd1cmF0aW9uLgotICoKLSAqIDxwPkVkaXRvcnMgc3VwcG9ydGluZyB0aGlzIGVkaXRvciBpbnB1dCBzaG91bGQgdXNlIHRoZSBSZXNvdXJjZU1hbmFnZXIKLSAqIHRvIGxvYWQgdGhlaXIgb3duIGNvcHkgb2YgdGhlIHJlc291cmNlLiBFYWNoIGVkaXRvciBpcyByZXNwb25zaWJsZQotICogZm9yIG1hbmFnaW5nIHRoaXMgcmVzb3VyY2UgYW5kIG1ha2luZyBzdXJlIHRoYXQgb25seSBvbmUgY29weSBpcwotICogbG9hZGVkIGZyb20gZGlzayB3aGVuIG11bHRpcGxlIGVkaXRvcnMgYXJlIG9wZW5lZCBvbiB0aGUgc2FtZQotICogcmVzb3VyY2UuPC9wPgotICoKLSAqIDxwPldoZW4gdGhlIGVkaXRvciBzYXZlcyBiYWNrIHRvIHRoZSByZXNvdXJjZSwgdGhlIHNlcnZlciB0b29saW5nCi0gKiB3aWxsIG5vdGljZSB0aGUgY2hhbmdlIGFuZCByZWxvYWQgdGhlIG5ldyBjb25maWd1cmF0aW9uLjwvcD4KLSAqCi0gKiA8cD5FZGl0b3JzIHNob3VsZCBjYWxsIHNldEVkaXRpbmcocmVzb3VyY2UsIHRydWUpIHdoZW4gdGhlIGZpcnN0Ci0gKiBlZGl0b3Igb3BlbnMgb24gYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhbmQgc2V0RWRpdGluZyhyZXNvdXJjZSwKLSAqIGZhbHNlKSB3aGVuIHRoZSBsYXN0IGVkaXRvciBvbiBhIHJlc291cmNlIGNsb3Nlcy4gVGhpcyB3aWxsCi0gKiBlbnN1cmUgdGhhdCB0aGUgc2VydmVyIHRvb2xpbmcgZG9lcyBub3QgdHJ5IHRvIGVkaXQgdGhlIHJlc291cmNlCi0gKiBhbmQgY2F1c2UgY29uZmxpY3RpbmcgY2hhbmdlcyB3aGlsZSBhbiBlZGl0b3IgaXMgb3Blbi48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVySWQ7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJJZCBhIHNlcnZlciBpZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JJbnB1dChTdHJpbmcgc2VydmVySWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXJJZCA9IHNlcnZlcklkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaWQuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkKCkgewotCQlyZXR1cm4gc2VydmVySWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmVyRWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2ZXJFZGl0b3JJbnB1dCBvdGhlciA9IChTZXJ2ZXJFZGl0b3JJbnB1dCkgb2JqOwotCQlpZiAoc2VydmVySWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnNlcnZlcklkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwkKLQkJfSBlbHNlIGlmICghc2VydmVySWQuZXF1YWxzKG90aGVyLnNlcnZlcklkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBlZGl0b3IgaW5wdXQgZXhpc3RzLiAgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvciBpbnB1dCBzaG91bGQgCi0JICogYXBwZWFyIGluIHRoZSAiRmlsZSBNb3N0IFJlY2VudGx5IFVzZWQiIG1lbnUuICBBbiBlZGl0b3IgaW5wdXQgd2lsbCBhcHBlYXIgCi0JICogaW4gdGhlIGxpc3QgdW50aWwgdGhlIHJldHVybiB2YWx1ZSBvZiA8Y29kZT5leGlzdHM8L2NvZGU+IGJlY29tZXMgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIGl0IGRyb3BzIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWRpdG9yIGlucHV0IGV4aXN0czsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICoJCW90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiBhbiBlbGVtZW50IGZhY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgCi0JICogdGhpcyBvYmplY3QuICBBbiBlbGVtZW50IGZhY3RvcnkgZXh0ZW5zaW9uIHdpdGggdGhpcyBJRCBtdXN0IGV4aXN0Ci0JICogd2l0aGluIHRoZSB3b3JrYmVuY2ggcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBmYWN0b3J5IElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJFZGl0b3JJbnB1dEZhY3RvcnkuRkFDVE9SWV9JRDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlZGl0b3IgaW5wdXQgZm9yIGRpc3BsYXkgcHVycG9zZXMuCi0JICogPHA+Ci0JICogRm9yIGluc3RhbmNlLCBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGlucHV0IG5hbWUgaXMKLQkgKiA8Y29kZT4iYVxiXE15RmlsZS5naWYiPC9jb2RlPiwgdGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBqdXN0Ci0JICogPGNvZGU+Ik15RmlsZS5naWYiPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gc2VydmVySWQ7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGVkaXRvciBpbnB1dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBlcnNpc3RhYmxlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWRpdG9yIGlucHV0Ci0JICogICBjYW5ub3QgYmUgcGVyc2lzdGVkCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOwotCQkJCWlmIChzZXJ2ZXIyLmdldEZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXMgPSBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChzLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJCXMgPSBzLnN1YnN0cmluZygxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcyA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHN0YXRlIG9mIGFuIGVsZW1lbnQgd2l0aGluIGEgbWVtZW50by4KLQkgKgotCSAqIEBwYXJhbSBtZW1lbnRvIHRoZSBzdG9yYWdlIGFyZWEgZm9yIGVsZW1lbnQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlTZXJ2ZXJFZGl0b3JJbnB1dEZhY3Rvcnkuc2F2ZVN0YXRlKG1lbWVudG8sIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTA2MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotLyoqCi0gKiBUaGlzIGZhY3RvcnkgaXMgdXNlZCBpbiB0aGUgcGVyc2lzdGVuY2Ugb2YgU2VydmVyUmVzb3VyY2VFZGl0b3JJbnB1dAotICogaW5zdGFuY2VzLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjbG9zZSB0aGUgd29ya2JlbmNoIHdpdGggYW4KLSAqIG9wZW4gZWRpdG9yIGFuZCByZW9wZW4gdG8gdGhlIHNhbWUgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvcklucHV0RmFjdG9yeSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBlZGl0b3IgaW5wdXQgYmFzZWQgb24gdGhlIHN0YXRlIGluIHRoZSBtZW1lbnRvLgotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBnZXQgdGhlIHJlc291cmNlIG5hbWVzCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKFNFUlZFUl9JRCk7Ci0JCQotCQlyZXR1cm4gbmV3IFNlcnZlckVkaXRvcklucHV0KHNlcnZlcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgc3RhdGUgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSBtZW1lbnRvLgotCSAqCi0JICogQHBhcmFtIG1lbWVudG8gdGhlIHN0b3JhZ2UgYXJlYSBmb3IgZWxlbWVudCBzdGF0ZQotCSAqIEBwYXJhbSBpbnB1dCBzZXJ2ZXIgZWRpdG9yIGlucHV0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvLCBTZXJ2ZXJFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlpZiAoaW5wdXQuZ2V0U2VydmVySWQoKSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoU0VSVkVSX0lELCBpbnB1dC5nZXRTZXJ2ZXJJZCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjMmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc2VydGlvbiBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBpbnNlcnRpb24gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydGlvbklkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluc2VydGlvbklkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZHMgb2YgdGhlIHNlcnZlciByZXNvdXJjZSBmYWN0b3JpZXMgKHNwZWNpZmllZAotCSAqIHVzaW5nIEphdmEtaW1wb3J0IHN0eWxlKSB0aGF0IHRoaXMgcGFnZSBtYXkgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR5cGUgaWRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I3N1cHBvcnRzVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSNzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpc0VuYWJsZWQoc2VydmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUiLCBlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSNjcmVhdGVTZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBlZGl0b3Igc2VjdGlvbiIsIHQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoZSBlbmFibGVtZW50IGxvZ2ljIGZvciB0aGUKLQkgKiBjb250ZXh0dWFsIGxhdW5jaCBlbGVtZW50IG9mIHRoaXMgbGF1bmNoIHNob3J0Y3V0IGRlc2NyaXB0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7IAotCi0JCQlpZiAoZW5hYmxlbWVudCAhPSBudWxsKQotCQkJCWZDb250ZXh0dWFsTGF1bmNoRXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0dWFsTGF1bmNoRXhwcjsKLQl9Ci0KLQkvKioKLQkgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQgYW5kIHJldHVybgotCSAqIHRoZSByZXN1bHQuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJlc3VsdCBpcyBlaXRoZXIgVFJVRSBvciBOT1RfTE9BREVELgotCSAqIFRoaXMgYWxsb3dzIG9wdGltaXN0aWMgaW5jbHVzaW9uIG9mIHNob3J0Y3V0cyBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGV4cCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwIHRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZXZhbHVhdGlvbi4gVXN1YWxseSwgdGhlCi0JICogIHVzZXIncyBzZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgb2JqKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIG9iaik7Ci0JCWNvbnRleHQuYWRkVmFyaWFibGUoInNlcnZlciIsIG9iaik7Ci0JCXJldHVybiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oY29udGV4dCwgZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyRWRpdG9yU2VjdGlvbiBbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0SW5zZXJ0aW9uSWQoKSArICIsICIgKyBnZXRPcmRlcigpICsgIl0iOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGNjMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvclBhcnRGYWN0b3J5IGltcGxlbWVudHMgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgRXhwcmVzc2lvbiBmQ29udGV4dHVhbExhdW5jaEV4cHIgPSBudWxsOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFydEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHBhcnQgZmFjdG9yeS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcnQgZmFjdG9yeS4gCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRJbnNlcnRpb25JZHMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaW5zZXJ0aW9uSWRzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluc2VydGlvbklkcyIpOwotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWlmIChpbnNlcnRpb25JZHMgIT0gbnVsbCAmJiBpbnNlcnRpb25JZHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnNlcnRpb25JZHMsICIsIik7Ci0JCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnkjc3VwcG9ydHNJbnNlcnRpb25JZChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbnNlcnRpb25JZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmdbXSBzID0gZ2V0SW5zZXJ0aW9uSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZHMgb2YgdGhlIHNlcnZlciBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24gdHlwZSBpZHMgKHNwZWNpZmllZAotCSAqIHVzaW5nIEphdmEtaW1wb3J0IHN0eWxlKSB0aGF0IHRoaXMgcGFnZSBtYXkgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR5cGUgaWRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnkjc3VwcG9ydHNUeXBlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKSB7Ci0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGggPT0gMCB8fCAiKiIuZXF1YWxzKHNbMF0pKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I3Nob3VsZENyZWF0ZVBhZ2UoSVNlcnZlcldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENyZWF0ZVBhZ2UoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGlzRW5hYmxlZChzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkjY3JlYXRlUGFnZSgpCi0JICovCi0JcHVibGljIElFZGl0b3JQYXJ0IGNyZWF0ZVBhZ2UoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElFZGl0b3JQYXJ0KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoZSBlbmFibGVtZW50IGxvZ2ljIGZvciB0aGUKLQkgKiBjb250ZXh0dWFsIGxhdW5jaCBlbGVtZW50IG9mIHRoaXMgbGF1bmNoIHNob3J0Y3V0IGRlc2NyaXB0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7IAotCi0JCQlpZiAoZW5hYmxlbWVudCAhPSBudWxsKQotCQkJCWZDb250ZXh0dWFsTGF1bmNoRXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0dWFsTGF1bmNoRXhwcjsKLQl9Ci0JCi0JLyoqCi0JICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4cHJlc3Npb24gd2l0aGluIHRoZSBnaXZlbiBjb250ZXh0IGFuZCByZXR1cm4KLQkgKiB0aGUgcmVzdWx0LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiByZXN1bHQgaXMgZWl0aGVyIFRSVUUgb3IgTk9UX0xPQURFRC4KLQkgKiBUaGlzIGFsbG93cyBvcHRpbWlzdGljIGluY2x1c2lvbiBvZiBzaG9ydGN1dHMgYmVmb3JlIHBsdWdpbnMgYXJlIGxvYWRlZC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBleHAgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGV4cCB0aGUgZW5hYmxlbWVudCBleHByZXNzaW9uIHRvIGV2YWx1YXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRpb24uIFVzdWFsbHksIHRoZQotCSAqICB1c2VyJ3Mgc2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXZhbEVuYWJsZW1lbnRFeHByZXNzaW9uKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0LCBFeHByZXNzaW9uIGV4cCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gKGV4cCAhPSBudWxsKSA/ICgoZXhwLmV2YWx1YXRlKGNvbnRleHQpKSAhPSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IG9iaikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBvYmopOwotCQljb250ZXh0LmFkZFZhcmlhYmxlKCJzZXJ2ZXIiLCBvYmopOwotCQlyZXR1cm4gZXZhbEVuYWJsZW1lbnRFeHByZXNzaW9uKGNvbnRleHQsIGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA0NWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yUGFydElucHV0IHsKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXJ2ZXJSZWFkT25seTsKLQlwcm90ZWN0ZWQgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlcjsKLQkKLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFydElucHV0KFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIsCi0JCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCAgYm9vbGVhbiBzZXJ2ZXJSZWFkT25seSkgewotCQkKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuc2VydmVyUmVhZE9ubHkgPSBzZXJ2ZXJSZWFkT25seTsKLQkJdGhpcy5zZXJ2ZXJDb21tYW5kTWFuYWdlciA9IHNlcnZlckNvbW1hbmRNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiLSI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuICItIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRvIGJlIGVkaXRlZC4KLQkgKgotCSAqIEByZXR1cm4gSVNlcnZlclJlc291cmNlCi0JICovCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmVyUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBzZXJ2ZXJSZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXJDb21tYW5kTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgWyIgKyBzZXJ2ZXIgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjJmZmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQSBjb21tYW5kIG1hbmFnZXIgZm9yIGEgc2luZ2xlIHNlcnZlciByZXNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgewotCXByb3RlY3RlZCBTZXJ2ZXJFZGl0b3IgZWRpdG9yOwotCXByb3RlY3RlZCBHbG9iYWxDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCi0JcHVibGljIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIoU2VydmVyRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBHbG9iYWxDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcikgewotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5jb21tYW5kTWFuYWdlciA9IGNvbW1hbmRNYW5hZ2VyOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoaWQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQgYW5kIHBsYWNlIGl0IGluIHRoZSB1bmRvIHN0YWNrLgotCSAqIElmIHRoZSBjb21tYW5kIGNhbm5vdCBiZSB1bmRvbmUsIHRoZSB1c2VyIHdpbGwgYmUgbm90aWZlZAotCSAqIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkgKgotCSAqIEBwYXJhbSBvcGVyYXRpb24gYW4gdW5kb2FibGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmICghdmFsaWRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoaWQpKSB7Ci0JCQl3YXJuUmVhZE9ubHkoKTsKLQkJCXJldHVybjsKLQkJfQotCQljb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChpZCwgb3BlcmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3YXJuUmVhZE9ubHkoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlV2FyblRpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlV2Fybk1lc3NhZ2U7Ci0JCQotCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRWRpdCgpIHsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoaWQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhpZCk7Ci0JCWlmIChmaWxlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkpOwotCQkKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCS8vIGluZm9ybSB1c2VyCi0JCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCQotCQkJLy8gY2hhbmdlIHRvIHJlYWQtb25seQotCQkJY29tbWFuZE1hbmFnZXIuc2V0UmVhZE9ubHkoaWQsIHRydWUpOwotCQkJCi0JCQkvLyBkbyBub3QgZXhlY3V0ZSBjb21tYW5kCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gY2hlY2sgZmlsZSB0aW1lc3RhbXAKLQkJSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyZmlsZSA9IGNvbW1hbmRNYW5hZ2VyLmdldFNlcnZlclJlc291cmNlKGlkKTsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmhhc0NoYW5nZWQoaWQpKSB7Ci0JCQlpZiAoc2VydmVyZmlsZSBpbnN0YW5jZW9mIElTZXJ2ZXIpCi0JCQkJZWRpdG9yLnByb21wdFJlbG9hZFNlcnZlckZpbGUoaWQpOwotCQl9Ci0JCQotCQkvLyBhbGxvdyBlZGl0Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJFZGl0b3IgZ2V0U2VydmVyRWRpdG9yKCkgewotCQlyZXR1cm4gZWRpdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGE2OGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JU3RhdHVzRmllbGQ7Ci0vKioKLSAqIENvbnRyaWJ1dGlvbiBpdGVtIGZvciB0aGUgc3RhdHVzIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gaW1wbGVtZW50cyBJU3RhdHVzRmllbGQgewotCi0Jc3RhdGljIGNsYXNzIFN0YXR1c0xpbmVMYWJlbCBleHRlbmRzIENMYWJlbCB7Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBpbnQgSU5ERU5UPSAzOyAvLyBsZWZ0IGFuZCByaWdodCBtYXJnaW4gdXNlZCBpbiBDTGFiZWwKLQkJCi0JCXByaXZhdGUgUG9pbnQgZkZpeGVkU2l6ZTsKLQkJCi0JCXB1YmxpYyBTdGF0dXNMaW5lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJCQotCQkJR0MgZ2M9IG5ldyBHQyhwYXJlbnQpOwotCQkJZ2Muc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCVBvaW50IGV4dGVudD0gZ2MudGV4dEV4dGVudCgiTU1NTU1NTU1NIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJZkZpeGVkU2l6ZT0gbmV3IFBvaW50KGV4dGVudC54ICsgSU5ERU5UICogMiwgMTApOwotCQl9Ci0JCQotCQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQkJcmV0dXJuIGZGaXhlZFNpemU7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JcHJpdmF0ZSBTdGF0dXNMaW5lTGFiZWwgZkxhYmVsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaXRlbSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGl0ZW0ncyBpZAotCSAqLwotCVN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJU3RhdHVzRmllbGQjc2V0VGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJZlRleHQ9IHRleHQ7Ci0JCWlmIChmTGFiZWwgIT0gbnVsbCAmJiAhZkxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJZkxhYmVsLnNldFRleHQoZlRleHQpOwotCQl9CQkKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTdGF0dXNGaWVsZCNzZXRJbWFnZShJbWFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlmSW1hZ2U9IGltYWdlOwotCQlpZiAoZkxhYmVsICE9IG51bGwgJiYgIWZMYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZMYWJlbC5zZXRJbWFnZShmSW1hZ2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ29udHJpYnV0aW9uSXRlbSNmaWxsKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkxhYmVsPSBuZXcgU3RhdHVzTGluZUxhYmVsKHBhcmVudCwgU1dULlNIQURPV19JTik7Ci0JCWZMYWJlbC5zZXREYXRhKHRoaXMpOwotCQkKLQkJaWYgKGZUZXh0ICE9IG51bGwpCi0JCQlmTGFiZWwuc2V0VGV4dChmVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9UZXh0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NThiNWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9UZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0vKioKLSAqIFRleHQgYWN0aW9ucyAoY3V0LCBjb3B5LCBwYXN0ZSkgZm9yIHRoZSBXZWIgYnJvd3Nlci4KLSAqLwotcHVibGljIGNsYXNzIFRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBEaXNwbGF5IGRpc3BsYXk7Ci0JcHJvdGVjdGVkIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0JcHJvdGVjdGVkIGJ5dGUgdHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDVVRfQUNUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09QWV9BQ1RJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQQVNURV9BQ1RJT04gPSAyOwotCQotCS8qKgotCSAqIFRleHRBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbihEaXNwbGF5IGRpc3BsYXksIGJ5dGUgdHlwZSkgewotCQlzdXBlcigiVGV4dCBhY3Rpb246ICIgKyB0eXBlKTsKLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLQkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBvaW50IGdldENvbnRyb2xTZWxlY3Rpb24oKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQlyZXR1cm4gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBjb250cm9sOwotCQkJcmV0dXJuIGNvbWJvLmdldFNlbGVjdGlvbigpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sU2VsZWN0aW9uKFBvaW50IHNlbCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKLQkJCWNvbWJvLnNldFNlbGVjdGlvbihzZWwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udHJvbFRleHQoKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQlyZXR1cm4gdGV4dC5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKLQkJCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRyb2xUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dDIgPSAoVGV4dCkgY29udHJvbDsKLQkJCXRleHQyLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKLQkJCWNvbWJvLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHB1dCBpbiB0aGUgCi0JICogY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgdGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCVRleHRUcmFuc2ZlciBwbGFpblRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJdHJ5IHsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMoCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSkgfSwgCi0JCQkJCW5ldyBUcmFuc2ZlcltdIHsgcGxhaW5UZXh0VHJhbnNmZXIgfSk7Ci0JCQl9IGNhdGNoIChTV1RFcnJvciBlcnJvcikgewotCQkJCS8vIENvcHkgdG8gY2xpcGJvYXJkIGZhaWxlZC4gVGhpcyBoYXBwZW5zIHdoZW4gYW5vdGhlciBhcHBsaWNhdGlvbiAKLQkJCQkvLyBpcyBhY2Nlc3NpbmcgdGhlIGNsaXBib2FyZCB3aGlsZSB3ZSBjb3B5LiBJZ25vcmUgdGhlIGVycm9yLgotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHB1dCBpbiB0aGUgCi0JICogY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0IGFuZCBSVEYgZm9ybWF0LgotCSAqLwotCXB1YmxpYyB2b2lkIGN1dCgpewotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc2VsZWN0aW9uLnkgPiBzZWxlY3Rpb24ueCkgewotCQkJY29weSgpOwotCQkJZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgY2hhcmFjdGVyIHRvIHRoZSByaWdodCBvZiB0aGUgY2FyZXQuIERlbGV0ZSB0aGUgc2VsZWN0ZWQgdGV4dCBpZiBhbnkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Q29udHJvbFRleHQoKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJaWYgKHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55KSB7Ci0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uLngpICsgdGV4dC5zdWJzdHJpbmcoc2VsZWN0aW9uLnkpOwotCQkJc2V0Q29udHJvbFRleHQodGV4dCk7Ci0JCQlzZXRDb250cm9sU2VsZWN0aW9uKG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLngpKTsKLQkJfQotCX0KLQkKLQkvKiogCi0JICogUmVwbGFjZXMgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBjbGlwYm9hcmQgdGV4dCBvciBpbnNlcnQgdGhlIHRleHQgYXQgCi0JICogdGhlIGN1cnJlbnQgY2FyZXQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbi4gCi0JICogSWYgdGhlIHdpZGdldCBoYXMgdGhlIFNXVC5TSU5HTEUgc3R5bGUgYW5kIHRoZSBjbGlwYm9hcmQgdGV4dCBjb250YWlucwotCSAqIG1vcmUgdGhhbiBvbmUgbGluZSwgb25seSB0aGUgZmlyc3QgbGluZSB3aXRob3V0IGxpbmUgZGVsaW1pdGVycyBpcyAKLQkgKiBpbnNlcnRlZCBpbiB0aGUgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHBhc3RlKCkgewotCQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJaWYgKG5ld1RleHQgIT0gbnVsbCAmJiBuZXdUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQl0ZXh0ID0gbmV3VGV4dDsKLQkJCWVsc2UKLQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uLngpICsgbmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKLQkJCXNldENvbnRyb2xUZXh0KHRleHQpOwotCQotCQkJLy8gc2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUgcGFzdGUKLQkJCWludCB4ID0gc2VsZWN0aW9uLnggKyBuZXdUZXh0Lmxlbmd0aCgpOwotCQkJc2V0Q29udHJvbFNlbGVjdGlvbihuZXcgUG9pbnQoeCwgeCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0eXBlID09IENVVF9BQ1RJT04pCi0JCQljdXQoKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBDT1BZX0FDVElPTikKLQkJCWNvcHkoKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBQQVNURV9BQ1RJT04pCi0JCQlwYXN0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbnMgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChnZXRDb250cm9sKCkgPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7Ci0KLQkJdHJ5IHsKLQkJCWlmICh0eXBlID09IENVVF9BQ1RJT04pCi0JCQkJc2V0RW5hYmxlZCh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDAgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPCBzZWxlY3Rpb24ueSk7Ci0JCQllbHNlIGlmICh0eXBlID09IENPUFlfQUNUSU9OKQotCQkJCXNldEVuYWJsZWQodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDwgc2VsZWN0aW9uLnkpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBQQVNURV9BQ1RJT04pIHsKLQkJCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCQkJaWYgKCFjb250cm9sLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSkgewotCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVRleHQgdGV4dDIgPSAoVGV4dCkgY29udHJvbDsKLQkJCQlpZiAoIXRleHQyLmdldEVkaXRhYmxlKCkpIHsKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJU3RyaW5nIG5ld1RleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJCXNldEVuYWJsZWQobmV3VGV4dCAhPSBudWxsICYmIG5ld1RleHQubGVuZ3RoKCkgPiAwKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHRleHQgYWN0aW9uIiwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpb25TaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2UwZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JbnN0YWxsYWJsZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Qcm9ncmVzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TaXRlIHsKLQlwcml2YXRlIElNZW1lbnRvIG1lbWVudG87Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uU2l0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubWVtZW50byA9IG1lbWVudG87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiBtZW1lbnRvLmdldFN0cmluZygidXJsIik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PElGZWF0dXJlPiBmZWF0dXJlTGlzdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNDYXRlZ29yeShJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJSUNhdGVnb3J5W10gY2F0ID0gcmVmLmdldENhdGVnb3JpZXMoKTsKLQkJaWYgKGNhdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBjYXQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0W2ldLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCWlmIChhID09IG51bGwgfHwgIioiLmVxdWFscyhhKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYSwgIiwiKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGMgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAoYi5lcXVhbHMoYykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SUZlYXR1cmU+IGdldEZlYXR1cmVzKFN0cmluZyBjYXRlZ29yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlTGlzdCAhPSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmVMaXN0OwotCQkKLQkJU3RyaW5nIGZyb21TaXRlID0gZ2V0VXJsKCk7Ci0JCQotCQlMaXN0PElGZWF0dXJlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRmVhdHVyZT4oKTsKLQkJaWYgKGZyb21TaXRlID09IG51bGwpCi0JCQlyZXR1cm4gbGlzdDsKLQkJCi0JCVVSTCBmcm9tU2l0ZVVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmcm9tU2l0ZVVSTCA9IG5ldyBVUkwoZnJvbVNpdGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJCi0JCW1vbml0b3IuYmVnaW5UYXNrKCJTZWFyY2hpbmcgIiArIGZyb21TaXRlLCAxMDApOwotCQlJU2l0ZSBzaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNpdGUgPSBJbnN0YWxsYWJsZVJ1bnRpbWUuZ2V0U2l0ZShmcm9tU2l0ZVVSTCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgaG9zdCA9IGZyb21TaXRlVVJMLmdldEhvc3QoKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBob3N0LCBlKSk7Ci0JCX0KLQkJLy8gamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24KLQkJCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGFzQ2F0ZWdvcnkoZmVhdHVyZVJlZnNbaV0sIGNhdGVnb3J5KSkgewotCQkJCWlmIChtYXRjaGVzKGZlYXR1cmVSZWZzW2ldLmdldE9TKCksIFBsYXRmb3JtLmdldE9TKCkpICYmCi0JCQkJCQltYXRjaGVzKGZlYXR1cmVSZWZzW2ldLmdldE9TQXJjaCgpLCBQbGF0Zm9ybS5nZXRPU0FyY2goKSkgJiYKLQkJCQkJCW1hdGNoZXMoZmVhdHVyZVJlZnNbaV0uZ2V0V1MoKSwgUGxhdGZvcm0uZ2V0V1MoKSkpIHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBmZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUpKTsKLQkJCQkJaWYgKGZlYXR1cmUyICE9IG51bGwpCi0JCQkJCQlsaXN0LmFkZChmZWF0dXJlMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCQkKLQkJZmVhdHVyZUxpc3QgPSBsaXN0OwotCQlyZXR1cm4gZmVhdHVyZUxpc3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJFeHRlbnNpb25TaXRlWyIgKyBnZXRVcmwoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmZhMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JbnN0YWxsYWJsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Qcm9ncmVzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkV4dGVuc2lvbldpemFyZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvblV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsYXVuY2hFeHRlbnNpb25XaXphcmQoU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRXh0ZW5zaW9uV2l6YXJkIHdpemFyZDIgPSBuZXcgRXh0ZW5zaW9uV2l6YXJkKHRpdGxlLCBtZXNzYWdlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZDIpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2lvblNpdGVbXSBnZXRFeHRlbnNpb25JdGVtcyhVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIFVSTCAiICsgdXJsKTsKLQkJfQotCQkKLQkJaWYgKGluID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvdWxkIG5vdCBsb2FkIGV4dGVuc2lvbnMiLCBudWxsKSk7Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkJSU1lbWVudG8gY2hpbGRyZW5bXSA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNpdGUiKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJTGlzdDxFeHRlbnNpb25TaXRlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFeHRlbnNpb25TaXRlPihzaXplKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJRXh0ZW5zaW9uU2l0ZSBpdGVtID0gbmV3IEV4dGVuc2lvblNpdGUoY2hpbGRyZW5baV0pOwotCQkJCWxpc3QuYWRkKGl0ZW0pOwotCQkJfQotCQkJCi0JCQlFeHRlbnNpb25TaXRlW10gaXRlbXMgPSBuZXcgRXh0ZW5zaW9uU2l0ZVtsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkoaXRlbXMpOwotCQkJcmV0dXJuIGl0ZW1zOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBleHRlbnNpb24gaXRlbXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZXh0ZW5zaW9ucyBpdGVtcyB7QGxpbmsgRXh0ZW5zaW9uU2l0ZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2lvblNpdGVbXSBnZXRFeHRlbnNpb25JdGVtcygpIHsKLQkJVVJMIHVybCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInNlcnZlckFkYXB0ZXJTaXRlcy54bWwiKTsKLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uSXRlbXModXJsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBleHRlbnNpb24gaXRlbXMiKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG5ldyBmZWF0dXJlIGlzIGFscmVhZHkgaW5zdGFsbGVkLCBvciBhIG5ld2VyIG9uZSBpcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhpc3RpbmcKLQkgKiBAcGFyYW0gbmV3RmVhdHVyZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IGZlYXR1cmUgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIG9yIGEgbmV3ZXIgb25lIGlzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5RXhpc3RzKExpc3QgZXhpc3RpbmcsIElGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJaWYgKGV4aXN0aW5nLmNvbnRhaW5zKG5ld0ZlYXR1cmUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIG5ld1ZpID0gbmV3RmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyB2ZXIgPSBuZXdWaS50b1N0cmluZygpOwotCQlpbnQgaW5kID0gdmVyLmluZGV4T2YoIl8iKTsKLQkJaWYgKGluZCA+PSAwKQotCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCVZlcnNpb24gbmV3ViA9IG5ldyBWZXJzaW9uKHZlcik7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4aXN0aW5nLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmkgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsgCi0JCQlpZiAodmkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhuZXdWaS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJdmVyID0gdmkudG9TdHJpbmcoKTsKLQkJCQlpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOwotCQkJCWlmIChpbmQgPj0gMCkKLQkJCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQkJVmVyc2lvbiBuZXh0Q2FuZCA9IG5ldyBWZXJzaW9uKHZlcik7Ci0JCQkJaWYgKG5leHRDYW5kLmNvbXBhcmVUbyhuZXdWKSA+PSAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlKExpc3Q8SUZlYXR1cmU+IGxpc3QsIExpc3Q8SUZlYXR1cmU+IGV4aXN0aW5nLCBJRmVhdHVyZSBuZXdGZWF0dXJlLCBGZWF0dXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGFscmVhZHlFeGlzdHMoZXhpc3RpbmcsIG5ld0ZlYXR1cmUpKQotCQkJcmV0dXJuOwotCQkKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBuZXdWaSA9IG5ld0ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlTdHJpbmcgdmVyID0gbmV3VmkudG9TdHJpbmcoKTsKLQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7Ci0JCWlmIChpbmQgPj0gMCkKLQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOwotCQlWZXJzaW9uIG5ld1YgPSBuZXcgVmVyc2lvbih2ZXIpOwotCQlJRmVhdHVyZSByZW1vdmUgPSBudWxsOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmkgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsgCi0JCQlpZiAodmkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhuZXdWaS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJdmVyID0gdmkudG9TdHJpbmcoKTsKLQkJCQlpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOwotCQkJCWlmIChpbmQgPj0gMCkKLQkJCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQkJVmVyc2lvbiBuZXh0Q2FuZCA9IG5ldyBWZXJzaW9uKHZlcik7Ci0JCQkJaWYgKG5leHRDYW5kLmNvbXBhcmVUbyhuZXdWKSA8IDApIHsKLQkJCQkJcmVtb3ZlID0gZmVhdHVyZTsKLQkJCQl9IGVsc2UgLy8gbmV3IGZlYXR1cmUgaXMgb2xkZXIKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmUgIT0gbnVsbCkgewotCQkJbGlzdC5yZW1vdmUocmVtb3ZlKTsKLQkJCWxpc3RlbmVyLmZlYXR1cmVSZW1vdmVkKHJlbW92ZSk7Ci0JCX0KLQkJCi0JCWxpc3QuYWRkKG5ld0ZlYXR1cmUpOwotCQlsaXN0ZW5lci5mZWF0dXJlRm91bmQobmV3RmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZlYXR1cmVzKExpc3Q8SUZlYXR1cmU+IGxpc3QsIExpc3Q8SUZlYXR1cmU+IGV4aXN0aW5nLCBMaXN0IG5ld0ZlYXR1cmVzLCBGZWF0dXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXdGZWF0dXJlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhZGRGZWF0dXJlKGxpc3QsIGV4aXN0aW5nLCAoSUZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBGZWF0dXJlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBmZWF0dXJlRm91bmQoSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVSZW1vdmVkKElGZWF0dXJlIGZlYXR1cmUpOwotCQlwdWJsaWMgdm9pZCBzaXRlRmFpbHVyZShTdHJpbmcgaG9zdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PElGZWF0dXJlPiBnZXRFeGlzdGluZ0ZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxvY2FsLCAxMDApOwotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWludCBzaXplID0gc2l0ZXMubGVuZ3RoOwotCQlMaXN0PElGZWF0dXJlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRmVhdHVyZT4oMjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IHNpdGVzW2ldLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlpbnQgc2l6ZTIgPSByZWZzLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUlGZWF0dXJlIGYgPSByZWZzW2pdLmdldEZlYXR1cmUoUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNSkpOwotCQkJCWlmICghbGlzdC5jb250YWlucyhmKSkKLQkJCQkJbGlzdC5hZGQoZik7Ci0JCQl9Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0QWxsRmVhdHVyZXMoZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBGZWF0dXJlTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMTAwKTsKLQkJCi0JCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxvY2FsKTsKLQkJZmluYWwgTGlzdDxJRmVhdHVyZT4gZXhpc3RpbmcgPSBnZXRFeGlzdGluZ0ZlYXR1cmVzKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQkKLQkJZmluYWwgRXh0ZW5zaW9uU2l0ZVtdIGl0ZW1zID0gRXh0ZW5zaW9uVXRpbGl0eS5nZXRFeHRlbnNpb25JdGVtcygpOwotCQlJSW5zdGFsbGFibGVTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyUGx1Z2luLmdldEluc3RhbGxhYmxlU2VydmVycygpOwotCQlmaW5hbCBpbnQgeCA9IDEwMDAgLyAoaXRlbXMubGVuZ3RoICsgc2VydmVycy5sZW5ndGgpOwotCQkKLQkJbW9uaXRvci53b3JrZWQoNTApOwotCQlmaW5hbCBMaXN0PElGZWF0dXJlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRmVhdHVyZT4oKTsKLQkJaW50IHNpemUgPSBpdGVtcy5sZW5ndGg7Ci0JCQotCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuaW5zdGFsbGFibGVTZXJ2ZXJTZWFyY2hpbmcsIGl0ZW1zW2ldLmdldFVybCgpKSk7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyID0gbW9uaXRvcjsKLQkJCQl0aHJlYWRzW2ldID0gbmV3IFRocmVhZCgiRXh0ZW5zaW9uIENoZWNrZXIiKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJTGlzdDxJRmVhdHVyZT4gbGlzdDIgPSBpdGVtc1tpaV0uZ2V0RmVhdHVyZXMoaWQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IyLCB4KSk7Ci0JCQkJCQkJYWRkRmVhdHVyZXMobGlzdCwgZXhpc3RpbmcsIGxpc3QyLCBsaXN0ZW5lcik7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJbGlzdGVuZXIuc2l0ZUZhaWx1cmUoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgZG93bmxvYWRpbmcgc2VydmVyIGFkYXB0ZXIgaW5mbyIsIGNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJdGhyZWFkc1tpXS5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJdGhyZWFkc1tpXS5zdGFydCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgZG93bmxvYWRpbmcgc2VydmVyIGFkYXB0ZXIgaW5mbyAyIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJaWYgKHRocmVhZHNbaV0uaXNBbGl2ZSgpKQotCQkJCQl0aHJlYWRzW2ldLmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGRvd25sb2FkaW5nIHNlcnZlciBhZGFwdGVyIGluZm8gMyIsIGUpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBhZGQgaW5zdGFsbGFibGUgc2VydmVycwotCQlzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUluc3RhbGxhYmxlU2VydmVyIGlzID0gKEluc3RhbGxhYmxlU2VydmVyKSBzZXJ2ZXJzW2ldOwotCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nLCBpcy5nZXRGcm9tU2l0ZSgpKSk7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gaXMuZ2V0RmVhdHVyZShQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCB4KSk7Ci0JCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJCWFkZEZlYXR1cmUobGlzdCwgZXhpc3RpbmcsIGZlYXR1cmUsIGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSUZlYXR1cmVbXSBlZiA9IG5ldyBJRmVhdHVyZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShlZik7Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGljZW5zZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQlyZXR1cm4gbGljZW5zZS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAobGljZW5zZSAhPSBudWxsKQotCQkJcmV0dXJuIGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVNlcnZlciNpbnN0YWxsKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIgPSBuZXcgSVZlcmlmaWNhdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyBpbnQgcHJvbXB0KElWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0KSB7Ci0JCQkJCXJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9PTkNFOwotCQkJCX0KLQkJCX07Ci0JCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmluc3RhbGwoZmVhdHVyZSwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW5zdGFsbGluZyBzZXJ2ZXIgYWRhcHRlciIsIGNlKTsKLQkJCXRocm93IGNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29ubmVjdGVkVUlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Nvbm5lY3RlZFVJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2QyNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29ubmVjdGVkVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGVkVUlEZWNvcmF0b3IgZXh0ZW5kcyBVSURlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc2VydmVyU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10gewotCQkiIiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nNCwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhcnRpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RvcHBpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdGFydGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zKQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdG9wcGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlTGFiZWwoaW50LCBTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gIiI7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdUZXh0W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ1RleHRbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWREZWJ1ZzsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQ7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkOwotCQkKLQkJcmV0dXJuIHNlcnZlclN0YXRlVW5tYW5hZ2VkW3N0YXRlXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2UoaW50LCBTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXR1cEFjdGlvbihBY3Rpb24gYWN0aW9uLCBpbnQgYWN0aW9uMikgewotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcFRvb2xUaXAyKTsKLQkJYWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcDIpOwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfRElTQ09OTkVDVCkpOwotCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9ESVNDT05ORUNUKSk7Ci0JCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX0RJU0NPTk5FQ1QpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVNlcnZlclRvb2xUaXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTZXJ2ZXJUb29sVGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODUzZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVNlcnZlclRvb2xUaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFByb3ZpZGVzIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBob3ZlciBvdmVyIG1vdXNlIGFjdGlvbiBvZiBhIHNlcnZlcgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJUb29sVGlwIHsKLQkvKioKLQkgKiBBbGxvd3MgYWRvcHRlcnMgdG8gYWRkIHdpZGdldHMgdG8gdGhlIHRvb2x0aXAuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50Ci0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyIHNlcnZlcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTWFuYWdlZFVJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9NYW5hZ2VkVUlEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDZjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9NYW5hZ2VkVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE1hbmFnZWRVSURlY29yYXRvciBleHRlbmRzIFVJRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzZXJ2ZXJTdGF0ZVVubWFuYWdlZCA9IG5ldyBTdHJpbmdbXSB7Ci0JCSIiLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzQsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkMn07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzdGFydGluZ1RleHQgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmcxLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmcyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmczfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzdG9wcGluZ1RleHQgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmcxLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmcyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmczfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZVtdIHN0YXJ0aW5nSW1hZ2VzID0gbmV3IEltYWdlW10gewotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18xKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMpCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZVtdIHN0b3BwaW5nSW1hZ2VzID0gbmV3IEltYWdlW10gewotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpCi0JfTsKLQotCS8qKgotCSAqIEBzZWUgVUlEZWNvcmF0b3IjZ2V0U3RhdGVMYWJlbChpbnQsIFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVMYWJlbChpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiAiIjsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBzdGFydGluZ1RleHRbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIHN0b3BwaW5nVGV4dFtjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZERlYnVnOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOwotCQkJZWxzZQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDsKLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQ7Ci0JCQotCQlyZXR1cm4gc2VydmVyU3RhdGVVbm1hbmFnZWRbc3RhdGVdOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVUlEZWNvcmF0b3IjZ2V0U3RhdGVJbWFnZShpbnQsIFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTdGF0ZUltYWdlKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIHN0b3BwaW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQpOwotCQllbHNlIHsgLy9pZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkvL1N0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVRyk7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEUpOwotCQkJZWxzZQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLQkJcmV0dXJuICJtb2R1bGUiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHVibGlzaGVkVUlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1B1Ymxpc2hlZFVJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjYzYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHVibGlzaGVkVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hlZFVJRGVjb3JhdG9yIGV4dGVuZHMgVUlEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNlcnZlclN0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKLQkJIiIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzQsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nNCwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQyfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXJ0aW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7Ci0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzEsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzN9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0b3BwaW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7Ci0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzEsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzN9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RhcnRpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RvcHBpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMikKLQl9OwotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUxhYmVsKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuICIiOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nVGV4dFtjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdUZXh0W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkRGVidWc7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDsKLQkJCi0JCXJldHVybiBzZXJ2ZXJTdGF0ZVVubWFuYWdlZFtzdGF0ZV07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUltYWdlKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBzdGFydGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCk7Ci0JCWVsc2UgeyAvL2lmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCS8vU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgewotCQlyZXR1cm4gIm1vZHVsZSI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0MDc0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgYWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIG9uIHRoZSBnaXZlbgotCSAqIHNlcnZlci4gVGhpcyBhbGxvd3MgYWN0aW9ucyB0byBiZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgc2VydmVyIHR5cGUKLQkgKiBvciBzZXJ2ZXIgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgYmVpbmcgZWRpdGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBkaXNwbGF5ZWQsIG9yCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSB0aGUgZWRpdG9yIHNpdGUKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIHNlcnZlciBlZGl0b3IgcG9ydCBpbnB1dAotCSAqIEByZXR1cm4gYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHJ1biBhZ2FpbnN0IHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUgc2l0ZSwgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBpbnB1dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTk1MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVUlEZWNvcmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TVE9QID0gMDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBhIHNlcnZlciBzdGF0ZQotCSAqIEBwYXJhbSBtb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gY291bnQgYSB0aW1lciBjb3VudAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdGVMYWJlbChpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZSBhIHNlcnZlciBzdGF0ZQotCSAqIEBwYXJhbSBtb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gY291bnQgYSB0aW1lciBjb3VudAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLQkJcmV0dXJuICJtb2R1bGUiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldHVwQWN0aW9uKEFjdGlvbiBhY3Rpb24sIGludCBhY3Rpb24yKSB7Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wVG9vbFRpcCk7Ci0JCWFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3ApOwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RPUCkpOwotCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUT1ApKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1ZmRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLQotcHVibGljIGNsYXNzIFVJRGVjb3JhdG9yTWFuYWdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVSURlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgTWFuYWdlZFVJRGVjb3JhdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBVSURlY29yYXRvciBnZXRVSURlY29yYXRvcihJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXJldHVybiBkZWNvcmF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9BYnN0cmFjdFNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTlmNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFuIGFjdGlvbiBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdFNlcnZlckFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMobnVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIHRleHQpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFNlcnZlckFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcihzZWxlY3Rpb25Qcm92aWRlciwgdGV4dCk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpOwotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKQotCQkJCXBlcmZvcm0oc2VydmVyKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZW5hYmxlZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsIGEgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKQotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Db3B5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNmZjEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Db3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogIkNvcHkiIG1lbnUgYWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWN0aW9uIHBhc3RlQWN0aW9uOwotCXByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotCS8qKgotCSAqIENvcHlBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGNsaXBib2FyZCB0aGUgY2xpcGJvYXJkCi0JICogQHBhcmFtIHBhc3RlQWN0aW9uIHRoZSBwYXN0ZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29weUFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc3AsIENsaXBib2FyZCBjbGlwYm9hcmQsIEFjdGlvbiBwYXN0ZUFjdGlvbikgewotCQlzdXBlcihzcCwgTWVzc2FnZXMuYWN0aW9uQ29weSk7Ci0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZX0RJU0FCTEVEKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5DT1BZKTsKLQkJCi0JCXRoaXMuY2xpcGJvYXJkID0gY2xpcGJvYXJkOwotCQl0aGlzLnBhc3RlQWN0aW9uID0gcGFzdGVBY3Rpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHsgbmV3IElTZXJ2ZXJbXSB7IHNlcnZlciB9LCBzZXJ2ZXIuZ2V0TmFtZSgpIH0sCi0JCQluZXcgVHJhbnNmZXJbXSB7IFNlcnZlclRyYW5zZmVyLmdldEluc3RhbmNlKCksIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODY2ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWxldGVTZXJ2ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogQWN0aW9uIGZvciBkZWxldGluZyBzZXJ2ZXIgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyW10gc2VydmVyczsKLQlwcm90ZWN0ZWQgSUZvbGRlcltdIGNvbmZpZ3M7Ci0KLQkvKioKLQkgKiBEZWxldGVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc3ApIHsKLQkJc3VwZXIoc2hlbGwsIHNwLCBNZXNzYWdlcy5hY3Rpb25EZWxldGUpOwotCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkRFTEVURSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXNlcnZlcnMgPSBuZXcgSVNlcnZlcltdIHsgc2VydmVyIH07Ci0JCUxpc3Q8SUZvbGRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZvbGRlcj4oKTsKLQkJCi0JCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBzdGlsbCByZWZlcmVuY2VkIGJ5IG90aGVyIHNlcnZlcnMKLQkJSVNlcnZlcltdIHNlcnZlcnMyID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzMiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKHNlcnZlcnNbaV0uZXF1YWxzKHNlcnZlcnMyW2pdKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IHNlcnZlcnMyW2pdLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoZm9sZGVyKSkKLQkJCQkJCWxpc3QucmVtb3ZlKGZvbGRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQljb25maWdzID0gbmV3IElGb2xkZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29uZmlncyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGVsZXRlU2VydmVyRGlhbG9nIGRzZCA9IG5ldyBEZWxldGVTZXJ2ZXJEaWFsb2coc2hlbGwsIHNlcnZlcnMsIGNvbmZpZ3MpOwotCQlkc2Qub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZmZhMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuSVNlcnZlck1vZHVsZTsKLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIGZvciByZWZlcmVuY2luZyBhIHNlcnZlciBhbmQgYSBtb2R1bGUgYXQgdGhlIHNhbWUgdGltZS4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVNlcnZlciBpbXBsZW1lbnRzIElTZXJ2ZXJNb2R1bGUgewotCS8qKgotCSAqIFRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBUaGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9kdWxlLXNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlU2VydmVyKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyIHRoYXQgdGhlIG1vZHVsZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOwotCQkKLQkJaWYgKG1zLnNlcnZlciA9PSBudWxsICYmIHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKG1zLnNlcnZlciAhPSBudWxsICYmICFtcy5zZXJ2ZXIuZXF1YWxzKHNlcnZlcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobXMubW9kdWxlLmxlbmd0aCAhPSBtb2R1bGUubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKCFtb2R1bGVbaV0uZXF1YWxzKG1zLm1vZHVsZVtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNiLmFwcGVuZCgiU2VydmVyLU1vZHVsZSBbIiArIHNlcnZlci5nZXRJZCgpICsgIi8iICsgc2VydmVyLmdldE5hbWUoKSArICIsICgiKTsKLQkJZWxzZQotCQkJc2IuYXBwZW5kKCJTZXJ2ZXItTW9kdWxlIFtudWxsLCAoIik7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApCi0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJc2IuYXBwZW5kKG1vZHVsZVtpXS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgiKV0iKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTbG9zaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNsb3NoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWQwNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNsb3NoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTW9kaWZ5TW9kdWxlc1dpemFyZDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVTbG9zaEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwdWJsaWMgTW9kdWxlU2xvc2hBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvbk1vZGlmeU1vZHVsZXMpOwotCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Nb2RpZnlNb2R1bGVzVG9vbFRpcCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbW9kdWxlcyBmaXJzdAotCQkvLyBnZXQgY3VycmVudGx5IGRlcGxveWVkIG1vZHVsZXMKLQkJTGlzdDxJTW9kdWxlPiBkZXBsb3llZCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJTGlzdDxJTW9kdWxlPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJTW9kdWxlW10gY3VycmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQlpZiAoY3VycmVudE1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjdXJyZW50TW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWRlcGxveWVkLmFkZChjdXJyZW50TW9kdWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCByZW1haW5pbmcgbW9kdWxlcwotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCkpOwotCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlczJbaV07Ci0JCQkJaWYgKCFkZXBsb3llZC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCi0JCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRlcGxveWVkLmlzRW1wdHkoKSAmJiBtb2R1bGVzLmlzRW1wdHkoKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIE1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMuZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNb2RpZnlNb2R1bGVzV2l6YXJkIHdpemFyZCA9IG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkKHNlcnZlcik7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclByb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5YzNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuTW9uaXRvckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSB0aGF0IGFsbG93cyBhIHVzZXIgdG8gbW9uaXRvciBwb3J0cyBmcm9tIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBNb25pdG9yQ29tcG9zaXRlIG1vbml0b3JDb21wOwotCi0JLyoqCi0JICogTW9uaXRvclByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYm9keSBvZiB0aGUgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCXNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50LmdldEFkYXB0ZXIoSVNlcnZlci5jbGFzcyk7Ci0JCQotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA1NTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JEZXNjcmlwdGlvbiwgbmV3IFN0cmluZ1tdIHsgc2VydmVyLmdldE5hbWUoKSB9ICkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQltb25pdG9yQ29tcCA9IG5ldyBNb25pdG9yQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUsIG51bGwsIHNlcnZlcik7Ci0JCW1vbml0b3JDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyUG9ydEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2I2MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTW9uaXRvcmVkU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogTW9uaXRvciBhIHNlcnZlciBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclNlcnZlclBvcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclBvcnQgcG9ydDsKLQlwcm90ZWN0ZWQgSU1vbml0b3JlZFNlcnZlclBvcnQgbW9uaXRvcmVkUG9ydDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja2VkOwotCQotCXB1YmxpYyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5hY3Rpb25Nb25pdG9yUG9ydCwgbmV3IFN0cmluZ1tdIHsgcG9ydC5nZXRQb3J0KCkgKyAiIiwgcG9ydC5nZXROYW1lKCkgfSkpOwotCQkKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCi0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0W10gbXNwcyA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9uaXRvcmVkUG9ydHMoc2VydmVyKTsKLQkJaWYgKG1zcHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtc3BzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHBvcnQuZXF1YWxzKG1zcHNbaV0uZ2V0U2VydmVyUG9ydCgpKSAmJiAvLyBtc3BzW2ldLmlzU3RhcnRlZCgpICYmCi0JCQkJCQkobXNwc1tpXS5nZXRDb250ZW50VHlwZXMoKSA9PSBudWxsIHx8IG1zcHNbaV0uZ2V0Q29udGVudFR5cGVzKCkubGVuZ3RoID09IDAgfHwKLQkJCQkJCShwb3J0LmdldENvbnRlbnRUeXBlcygpICE9IG51bGwgJiYgbXNwc1tpXS5nZXRDb250ZW50VHlwZXMoKS5sZW5ndGggPT0gcG9ydC5nZXRDb250ZW50VHlwZXMoKS5sZW5ndGgpKSkKLQkJCQkJbW9uaXRvcmVkUG9ydCA9IG1zcHNbaV07Ci0JCQl9Ci0JCX0KLQotCQljaGVja2VkID0gbW9uaXRvcmVkUG9ydCAhPSBudWxsOyAvLyAmJiBtb25pdG9yZWRQb3J0LmlzU3RhcnRlZCgpOwotCQlzZXRDaGVja2VkKGNoZWNrZWQpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBvciBkaXNhYmxlIG1vbml0b3JpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU2VydmVyTW9uaXRvck1hbmFnZXIgc21tID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGNoZWNrZWQpIHsKLQkJCXNtbS5yZW1vdmVNb25pdG9yKG1vbml0b3JlZFBvcnQpOwotCQl9IGVsc2UgewotCQkJaWYgKG1vbml0b3JlZFBvcnQgPT0gbnVsbCkKLQkJCQltb25pdG9yZWRQb3J0ID0gc21tLmNyZWF0ZU1vbml0b3Ioc2VydmVyLCBwb3J0LCAtMSwgbnVsbCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJc21tLnN0YXJ0TW9uaXRvcihtb25pdG9yZWRQb3J0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG1vbml0b3IiLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL09wZW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExNTVmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqICJPcGVuIiBtZW51IGFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JLyoqCi0JICogT3BlbkFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT3BlbkFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc3ApIHsKLQkJc3VwZXIoc3AsIE1lc3NhZ2VzLmFjdGlvbk9wZW4pOwotCQkKLQkJLy9zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5PcGVuIik7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uZWRpdG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQl0cnkgewotCQkJU2VydmVyVUlQbHVnaW4uZWRpdFNlcnZlcihzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZWRpdGluZyBlbGVtZW50IiwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Bhc3RlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUGFzdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5MDA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqICJQYXN0ZSIgbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXN0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHsKLQlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLQkvKioKLQkgKiBQYXN0ZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbDsKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKiBAcGFyYW0gY2xpcGJvYXJkIHRoZSBjbGlwYm9hcmQKLQkgKi8KLQlwdWJsaWMgUGFzdGVBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzcCwgQ2xpcGJvYXJkIGNsaXBib2FyZCkgewotCQlzdXBlcihzcCwgTWVzc2FnZXMuYWN0aW9uUGFzdGUpOwotCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFX0RJU0FCTEVEKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5QQVNURSk7Ci0JCQotCQl0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKLQkJLy9zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHNlbCBhIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCVNlcnZlclRyYW5zZmVyIHNlcnZlclRyYW5zZmVyID0gU2VydmVyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSAoSVNlcnZlcltdKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoc2VydmVyVHJhbnNmZXIpOwotCQlzZXRFbmFibGVkKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2VydmVyVHJhbnNmZXIgc2VydmVyVHJhbnNmZXIgPSBTZXJ2ZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlJU2VydmVyW10gc2VydmVycyA9IChJU2VydmVyW10pIGNsaXBib2FyZC5nZXRDb250ZW50cyhzZXJ2ZXJUcmFuc2Zlcik7Ci0JCQotCQlpZiAoc2VydmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyc1tpXS5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpd2MpLmRpc2Fzc29jaWF0ZSgpOwotCQkJCXdjLnNldE5hbWUoIlRlbXAiKTsgLy8gc2V0cyB0aGUgbmFtZSBmcm9tIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IHRoZQotCQkJCQkJLy8gZGVmYXVsdCBuYW1lIGdlbmVyYXRpb24gd2lsbCB3b3JrCi0JCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZSh3Yyk7Ci0JCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRmFpbHVyZSB0byBjb3B5IHNlcnZlciIsIGNlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHJvcGVydGllc0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Byb3BlcnRpZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwYWQ5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHJvcGVydGllc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEFjdGlvbiB0byBzaG93IHRoZSBwcm9wZXJ0eSBwYWdlIGZvciBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm9wZXJ0eVBhZ2VJZDsKLQotCXB1YmxpYyBQcm9wZXJ0aWVzQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJdGhpcyhzaGVsbCwgbnVsbCwgc2VsZWN0aW9uUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgcHJvcGVydHlQYWdlSWQsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblByb3BlcnRpZXMpOwotCQl0aGlzLnByb3BlcnR5UGFnZUlkID0gcHJvcGVydHlQYWdlSWQ7Ci0JCWlmIChwcm9wZXJ0eVBhZ2VJZCA9PSBudWxsKQotCQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlBST1BFUlRJRVMpOwotCQkKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHByb3BlcnR5UGFnZUlkID09IG51bGwpCi0JCQlwcm9wZXJ0eVBhZ2VJZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnRpZXMiOwotCQlEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oc2hlbGwsIHNlcnZlciwgcHJvcGVydHlQYWdlSWQsIG51bGwsIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1B1Ymxpc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0ZDEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogUHVibGlzaCB0byBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHVibGljIFB1Ymxpc2hBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2gpOwotCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25QdWJsaXNoVG9vbFRpcCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1BVQkxJU0gpKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9QVUJMSVNIKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfUFVCTElTSCkpOwotCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHVibGlzaCIpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBzZXJ2ZXIuY2FuUHVibGlzaCgpLmlzT0soKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXB1Ymxpc2goc2VydmVyLCBzaGVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHB1Ymxpc2goSVNlcnZlciBzZXJ2ZXIsIGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChzaGVsbCAhPSBudWxsICYmICFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5zYXZlRWRpdG9ycygpKQotCQkJcmV0dXJuOwotCQkKLQkJSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCXJldHVybiBzaGVsbDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJCi0JCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQ2xlYW5BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQ2xlYW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4YWE2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaENsZWFuQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBDbGVhbiBwdWJsaXNoIHRvIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENsZWFuQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXB1YmxpYyBQdWJsaXNoQ2xlYW5BY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2hDbGVhbik7Ci0JCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2hDbGVhblRvb2xUaXApOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBzZXJ2ZXIuY2FuUHVibGlzaCgpLmlzT0soKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQlpZiAoIVNlcnZlclVJUGx1Z2luLnByb21wdElmRGlydHkoc2hlbGwsIHNlcnZlcikpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dQdWJsaXNoQ2xlYW4pKSB7Ci0JCQlJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQkJcmV0dXJuIHNoZWxsOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfQ0xFQU4sIG51bGwsIGluZm8sIG51bGwpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW1vdmVNb2R1bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW1vdmVNb2R1bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5OGFmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVtb3ZlTW9kdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogQWN0aW9uIGZvciByZW1vdmluZyBhIG1vZHVsZSBmcm9tIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCS8qKgotCSAqIFJlbW92ZU1vZHVsZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICovCi0JcHVibGljIFJlbW92ZU1vZHVsZUFjdGlvbihTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblJlbW92ZSk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJCi0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy4gCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dSZW1vdmVNb2R1bGVDb25maXJtKSkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQl3Yy5tb2RpZnlNb2R1bGVzKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7Ci0JCQkJc2VydmVyID0gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQkJCQkKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEICYmICgoU2VydmVyKXNlcnZlcikuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCkgIT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKSB7Ci0JCQkJCWZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbW92ZSBtb2R1bGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVuYW1lQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDhkZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5UZXh0QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEFjdGlvbiB0byByZW5hbWUgYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JLyoKLQkgKiBUaGUgdHJlZSBlZGl0aW5nIHdpZGdldHMuIElmIHRyZWVFZGl0b3IgaXMgbnVsbCB0aGVuIGVkaXQgdXNpbmcgdGhlCi0JICogZGlhbG9nLiBXZSBrZWVwIHRoZSBlZGl0b3JUZXh0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbiBjbG9zZSBpdCBpZiBhIG5ldwotCSAqIHNlbGVjdGlvbiBpcyBtYWRlLgotCSAqLwotCXByb3RlY3RlZCBUcmVlRWRpdG9yIHRyZWVFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgVHJlZSB0cmVlOwotCi0JcHJvdGVjdGVkIFRleHQgdGV4dEVkaXRvcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdGV4dEVkaXRvclBhcmVudDsKLQotCXByaXZhdGUgVGV4dEFjdGlvbkhhbmRsZXIgdGV4dEFjdGlvbkhhbmRsZXI7Ci0KLQkvLyBUaGUgc2VydmVyIGJlaW5nIGVkaXRlZCBpZiB0aGlzIGlzIGJlaW5nIGRvbmUgaW5saW5lCi0JcHJvdGVjdGVkIElTZXJ2ZXIgZWRpdGVkU2VydmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2aW5nID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVuYW1lQWN0aW9uKFNoZWxsIHNoZWxsLCBUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uUmVuYW1lKTsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlJFTkFNRSk7Ci0JCXRoaXMudHJlZSA9IHZpZXdlci5nZXRUcmVlKCk7Ci0JCXRoaXMudHJlZUVkaXRvciA9IG5ldyBUcmVlRWRpdG9yKHRyZWUpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQlydW5XaXRoSW5saW5lRWRpdG9yKHNlcnZlcik7Ci0JfQotCi0JLyoKLQkgKiBSdW4gdGhlIHJlY2VpdmVyIHVzaW5nIGFuIGlubGluZSBlZGl0b3IgZnJvbSB0aGUgc3VwcGxpZWQgbmF2aWdhdG9yLiBUaGUKLQkgKiBuYXZpZ2F0b3Igd2lsbCB0ZWxsIHRoZSBhY3Rpb24gd2hlbiB0aGUgcGF0aCBpcyByZWFkeSB0byBydW4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJ1bldpdGhJbmxpbmVFZGl0b3IoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcXVlcnlOZXdTZXJ2ZXJOYW1lSW5saW5lKHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogT24gTWFjIHRoZSB0ZXh0IHdpZGdldCBhbHJlYWR5IHByb3ZpZGVzIGEgYm9yZGVyIHdoZW4gaXQgaGFzIGZvY3VzLCBzbwotCSAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gZHJhdyBhbm90aGVyIG9uZS4gVGhlIHZhbHVlIG9mIHJldHVybmVkIGJ5IHRoaXMKLQkgKiBtZXRob2QgaXMgdXNkIHRvIGNvbnRyb2wgdGhlIGluc2V0IHdlIGFwcGx5IHRvIHRoZSB0ZXh0IGZpZWxkIGJvdW5kJ3MgaW4KLQkgKiBvcmRlciB0byBnZXQgc3BhY2UgZm9yIGRyYXdpbmcgYSBib3JkZXIuIEEgdmFsdWUgb2YgMSBtZWFucyBhIG9uZS1waXhlbAotCSAqIHdpZGUgYm9yZGVyIGFyb3VuZCB0aGUgdGV4dCBmaWVsZC4gQSBuZWdhdGl2ZSB2YWx1ZSBzdXByZXNzZXMgdGhlIGJvcmRlci4KLQkgKiBIb3dldmVyLCBpbiBNOSB0aGUgc3lzdGVtIHByb3BlcnR5Ci0JICogIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24ubm9Gb2N1c1JpbmciIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYQotCSAqIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgIzI4ODQyLiBUaGUgZXhpc3RlbmNlIG9mIHRoZSBwcm9wZXJ0eSB0dXJucwotCSAqIHRoZSBuYXRpdmUgZm9jdXMgcmluZyBvZmYgaWYgdGhlIHdpZGdldCBpcyBjb250YWluZWQgaW4gYSBtYWluIHdpbmRvdwotCSAqIChub3QgZGlhbG9nKS4gVGhlIGNoZWNrIGZvciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBmaW5hbAotCSAqIGZpeCBmb3IgIzI4ODQyIGhhcyBiZWVuIHByb3ZpZGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRDZWxsRWRpdG9ySW5zZXQoQ29udHJvbCBjKSB7Ci0JCS8vIHNwZWNpYWwgY2FzZSBmb3IgTWFjT1MgWAotCQlpZiAoImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU3lzdGVtCi0JCQkJCS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5ub0ZvY3VzUmluZyIpID09IG51bGwgfHwgYy5nZXRTaGVsbCgpLmdldFBhcmVudCgpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAtMjsgLy8gbmF0aXZlIGJvcmRlcgotCQkJfQotCQl9Ci0JCXJldHVybiAxOyAvLyBvbmUgcGl4ZWwgd2lkZSBibGFjayBib3JkZXIKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFRyZWUgYmVpbmcgZWRpdGVkLgotCSAqIAotCSAqIEByZXR1cm5UcmVlCi0JICovCi0JcHJpdmF0ZSBUcmVlIGdldFRyZWUoKSB7Ci0JCXJldHVybiB0cmVlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVBhcmVudCgpIHsKLQkJVHJlZSB0cmVlMiA9IGdldFRyZWUoKTsKLQkJQ29tcG9zaXRlIHJlc3VsdCA9IG5ldyBDb21wb3NpdGUodHJlZTIsIFNXVC5OT05FKTsKLQkJVHJlZUl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gdHJlZTIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXRyZWVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQl0cmVlRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IocmVzdWx0LCBzZWxlY3RlZEl0ZW1zWzBdKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ldyBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2Ugb3IKLQkgKiA8Y29kZT5udWxsPGNvZGU+Ci0JICogaWYgdGhlIHF1ZXJ5IHdhcyBjYW5jZWxlZC4gUmVuYW1lIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc2VydmVyIHVzaW5nIHRoZSB0YWJsZSBlZGl0b3IuIAotCSAqIENvbnRpbnVlIHRoZSBhY3Rpb24gd2hlbiB0aGUgdXNlciBpcyBkb25lLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHJlbmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBxdWVyeU5ld1NlcnZlck5hbWVJbmxpbmUoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gTWFrZSBzdXJlIHRleHQgZWRpdG9yIGlzIGNyZWF0ZWQgb25seSBvbmNlLiBTaW1wbHkgcmVzZXQgdGV4dAotCQkvLyBlZGl0b3Igd2hlbiBhY3Rpb24gaXMgZXhlY3V0ZWQgbW9yZSB0aGFuIG9uY2UuIEZpeGVzIGJ1ZyAyMjI2OQotCQlpZiAodGV4dEVkaXRvclBhcmVudCA9PSBudWxsKSB7Ci0JCQljcmVhdGVUZXh0RWRpdG9yKHNlcnZlcik7Ci0JCX0KLQkJdGV4dEVkaXRvci5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCi0JCS8vIE9wZW4gdGV4dCBlZGl0b3Igd2l0aCBpbml0aWFsIHNpemUKLQkJdGV4dEVkaXRvclBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHRFZGl0b3IuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dFNpemUueCArPSB0ZXh0U2l6ZS55OyAvLyBBZGQgZXh0cmEgc3BhY2UgZm9yIG5ldyBjaGFyYWN0ZXJzCi0JCVBvaW50IHBhcmVudFNpemUgPSB0ZXh0RWRpdG9yUGFyZW50LmdldFNpemUoKTsKLQkJaW50IGluc2V0ID0gZ2V0Q2VsbEVkaXRvckluc2V0KHRleHRFZGl0b3JQYXJlbnQpOwotCQl0ZXh0RWRpdG9yLnNldEJvdW5kcygyLCBpbnNldCwgTWF0aC5taW4odGV4dFNpemUueCwgcGFyZW50U2l6ZS54IC0gNCksCi0JCQkJcGFyZW50U2l6ZS55IC0gMiAqIGluc2V0KTsKLQkJdGV4dEVkaXRvclBhcmVudC5yZWRyYXcoKTsKLQkJdGV4dEVkaXRvci5zZWxlY3RBbGwoKTsKLQkJdGV4dEVkaXRvci5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdGV4dCBlZGl0b3Igd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byByZW5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGV4dEVkaXRvcihmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQkvLyBDcmVhdGUgdGV4dCBlZGl0b3IgcGFyZW50LiBUaGlzIGRyYXdzIGEgbmljZSBib3VuZGluZyByZWN0Ci0JCXRleHRFZGl0b3JQYXJlbnQgPSBjcmVhdGVQYXJlbnQoKTsKLQkJdGV4dEVkaXRvclBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJZmluYWwgaW50IGluc2V0ID0gZ2V0Q2VsbEVkaXRvckluc2V0KHRleHRFZGl0b3JQYXJlbnQpOwotCQlpZiAoaW5zZXQgPiAwKSB7Ci0JCQl0ZXh0RWRpdG9yUGFyZW50LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0RWRpdG9yLmdldFNpemUoKTsKLQkJCQkJUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotCQkJCQllLmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgTWF0aC5taW4odGV4dFNpemUueCArIDQsCi0JCQkJCQkJcGFyZW50U2l6ZS54IC0gMSksIHBhcmVudFNpemUueSAtIDEpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCS8vIENyZWF0ZSBpbm5lciB0ZXh0IGVkaXRvcgotCQl0ZXh0RWRpdG9yID0gbmV3IFRleHQodGV4dEVkaXRvclBhcmVudCwgU1dULk5PTkUpOwotCQl0ZXh0RWRpdG9yLnNldEZvbnQodHJlZS5nZXRGb250KCkpOwotCQl0ZXh0RWRpdG9yUGFyZW50LnNldEJhY2tncm91bmQodGV4dEVkaXRvci5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0RWRpdG9yLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHRFZGl0b3IuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCk7Ci0JCQkJdGV4dFNpemUueCArPSB0ZXh0U2l6ZS55OyAvLyBBZGQgZXh0cmEgc3BhY2UgZm9yIG5ldwotCQkJCS8vIGNoYXJhY3RlcnMuCi0JCQkJUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotCQkJCXRleHRFZGl0b3Iuc2V0Qm91bmRzKDIsIGluc2V0LCBNYXRoLm1pbih0ZXh0U2l6ZS54LAotCQkJCQkJcGFyZW50U2l6ZS54IC0gNCksIHBhcmVudFNpemUueSAtIDIgKiBpbnNldCk7Ci0JCQkJdGV4dEVkaXRvclBhcmVudC5yZWRyYXcoKTsKLQkJCX0KLQkJfSk7Ci0JCXRleHRFZGl0b3IuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCi0JCQkJLy8gV29ya2Fyb3VuZCBmb3IgQnVnIDIwMjE0IGR1ZSB0byBleHRyYQotCQkJCS8vIHRyYXZlcnNlIGV2ZW50cwotCQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkvLyBEbyBub3RoaW5nIGluIHRoaXMgY2FzZQotCQkJCQlkaXNwb3NlVGV4dFdpZGdldCgpOwotCQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJc2F2ZUNoYW5nZXNBbmREaXNwb3NlKHNlcnZlcik7Ci0JCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdGV4dEVkaXRvci5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBmZSkgewotCQkJCXNhdmVDaGFuZ2VzQW5kRGlzcG9zZShzZXJ2ZXIpOwotCQkJfQotCQl9KTsKLQotCQlpZiAodGV4dEFjdGlvbkhhbmRsZXIgIT0gbnVsbCkgewotCQkJdGV4dEFjdGlvbkhhbmRsZXIuYWRkVGV4dCh0ZXh0RWRpdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlIHRoZSB0ZXh0IHdpZGdldCBhbmQgcmVzZXQgdGhlIGVkaXRvclRleHQgZmllbGQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZVRleHRXaWRnZXQoKSB7Ci0JCWlmICh0ZXh0QWN0aW9uSGFuZGxlciAhPSBudWxsKQotCQkJdGV4dEFjdGlvbkhhbmRsZXIucmVtb3ZlVGV4dCh0ZXh0RWRpdG9yKTsKLQotCQlpZiAodGV4dEVkaXRvclBhcmVudCAhPSBudWxsKSB7Ci0JCQl0ZXh0RWRpdG9yUGFyZW50LmRpc3Bvc2UoKTsKLQkJCXRleHRFZGl0b3JQYXJlbnQgPSBudWxsOwotCQkJdGV4dEVkaXRvciA9IG51bGw7Ci0JCQl0cmVlRWRpdG9yLnNldEVkaXRvcihudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGNoYW5nZXMgYW5kIGRpc3Bvc2Ugb2YgdGhlIHRleHQgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byByZW5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlQ2hhbmdlc0FuZERpc3Bvc2UoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNhdmluZyA9PSB0cnVlKQotCQkJcmV0dXJuOwotCQkKLQkJc2F2aW5nID0gdHJ1ZTsKLQkJLy8gQ2FjaGUgdGhlIHJlc291cmNlIHRvIGF2b2lkIHNlbGVjdGlvbiBsb3NzIHNpbmNlIGEgc2VsZWN0aW9uIG9mCi0JCS8vIGFub3RoZXIgaXRlbSBjYW4gdHJpZ2dlciB0aGlzIG1ldGhvZAotCQllZGl0ZWRTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWZpbmFsIFN0cmluZyBuZXdOYW1lID0gdGV4dEVkaXRvci5nZXRUZXh0KCk7Ci0JCS8vIFJ1biB0aGlzIGluIGFuIGFzeW5jIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gdGhhdCB0cmlnZ2VyZWQKLQkJLy8gdGhpcyBhY3Rpb24gaXMgY29tcGxldGVkLiBPdGhlcndpc2UgdGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aGVuIHRoZQotCQkvLyBpY29uIG9mIHRoZSBpdGVtIGJlaW5nIHJlbmFtZWQgaXMgY2xpY2tlZCAoaS5lLiwgd2hpY2ggY2F1c2VzIHRoZQotCQkvLyByZW5hbWUgdGV4dCB3aWRnZXQgdG8gbG9zZSBmb2N1cyBhbmQgdHJpZ2dlciB0aGlzIG1ldGhvZCkKLQkJZ2V0VHJlZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhlZGl0ZWRTZXJ2ZXIuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKFNlcnZlclBsdWdpbi5pc05hbWVJblVzZShlZGl0ZWRTZXJ2ZXIsIG5ld05hbWUpKSB7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMuZXJyb3JEdXBsaWNhdGVOYW1lKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gZWRpdGVkU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCQkJCXdjLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCQkJCXdjLnNhdmUoZmFsc2UsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCQkJLy8gaWdub3JlIGZvciBub3cKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWRpdGVkU2VydmVyID0gbnVsbDsKLQkJCQkJLy8gRGlzcG9zZSB0aGUgdGV4dCB3aWRnZXQgcmVnYXJkbGVzcwotCQkJCQlkaXNwb3NlVGV4dFdpZGdldCgpOwotCQkJCQkvLyBFbnN1cmUgdGhlIE5hdmlnYXRvciB0cmVlIGhhcyBmb2N1cywgd2hpY2ggaXQgbWF5IG5vdCBpZgotCQkJCQkvLyB0aGUgdGV4dCB3aWRnZXQgcHJldmlvdXNseSBoYWQgZm9jdXMKLQkJCQkJaWYgKHRyZWUgIT0gbnVsbCAmJiAhdHJlZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXRyZWUuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNhdmluZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0TW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVzdGFydE1vZHVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNjZDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0TW9kdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIFJlc3RhcnQgYSBtb2R1bGUgb24gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0TW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7Ci0KLQlwdWJsaWMgUmVzdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnRNb2R1bGUpOwotCQkKLQkJc2V0RW5hYmxlZChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKLQkJCQkmJiBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSAhPSBJU2VydmVyLlNUQVRFX1VOS05PV04KLQkJCQkmJglzZXJ2ZXIuY2FuQ29udHJvbE1vZHVsZShtb2R1bGUsIG51bGwpLmlzT0soKSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCUpvYiByZXN0YXJ0Sm9iID0gbmV3IEpvYihOTFMuYmluZChNZXNzYWdlcy5qb2JSZXN0YXJ0aW5nLCBtb2R1bGVbc2l6ZS0xXS5nZXROYW1lKCkpKSB7Ci0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJc2VydmVyLnJlc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlckFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2NTUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotLyoqCi0gKiBTZXJ2ZXIgYWN0aW9uIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJBY3Rpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU2VsZWN0aW9uIHNlbCA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV2ZW50KTsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0JCQlvYmogPSBzZWxlY3QuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBpZCA9IGV2ZW50LmdldENvbW1hbmQoKS5nZXRJZCgpOwotCQlpZiAoaWQuZW5kc1dpdGgoInB1Ymxpc2giKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlQdWJsaXNoQWN0aW9uLnB1Ymxpc2goKElTZXJ2ZXIpIG9iaiwgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKLQkJCX0gZWxzZQotCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIk5vIHNlcnZlciBzZWxlY3RlZCIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBtb2RlID0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7Ci0JCWlmIChpZC5lbmRzV2l0aCgiZGVidWciKSkKLQkJCW1vZGUgPSBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFOwotCQllbHNlIGlmIChpZC5lbmRzV2l0aCgicHJvZmlsZSIpKQotCQkJbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERTsKLQkJZWxzZSBpZiAoaWQuZW5kc1dpdGgoInN0b3AiKSkKLQkJCW1vZGUgPSBudWxsOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCWlmIChtb2RlID09IG51bGwpCi0JCQkJU3RvcEFjdGlvbi5zdG9wKHNlcnZlciwgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKLQkJCWVsc2UKLQkJCQlTdGFydEFjdGlvbi5zdGFydChzZXJ2ZXIsIG1vZGUsIEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSByb3MgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlyb3Muc2V0TGF1bmNoTW9kZShtb2RlKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJLy8gZHVtbXkgYWN0aW9uCi0JCX07Ci0JCXJvcy5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsKTsKLQkJcm9zLnJ1bihhY3Rpb24pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNjU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5VSURlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDZWxsTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIFNlcnZlciB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VDZWxsTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzeW5jU3RhdGUgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3luY09rYXksCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUmVzdGFydCwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoLAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnRQdWJsaXNoLAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2hpbmd9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzeW5jU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3luY09rYXkyLAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnQyLAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2gyLAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnRQdWJsaXNoMiwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoaW5nMn07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtb2R1bGVQdWJsaXNoU3RhdGUgPSBuZXcgU3RyaW5nW10gewotCQkiIiwKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5LAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2gsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaH07Ci0KLQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlciBkZWZhdWx0U2VydmVyOwotCi0JLyoqCi0JICogU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VydmVyKElTZXJ2ZXIgZHMpIHsKLQkJZGVmYXVsdFNlcnZlciA9IGRzOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIGdldERlZmF1bHRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBkZWZhdWx0U2VydmVyOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgewotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQkvL3JldHVybiBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV0pOwotCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCUltYWdlIGltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdKTsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIG1zKTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlYzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJaWYgKG1zLnNlcnZlciA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvKmludCBzdGF0ZSA9IG1zLnNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpOwotCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NUQVRFX1NUQVJURUQpOwotCQkJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU1RBVEVfU1RPUFBFRCk7Ci0JCQkJKi8KLQkJCQlyZXR1cm4gZ2V0U3RhdGVJbWFnZShtcy5zZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBtcy5zZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobXMubW9kdWxlKSwgbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoU2VydmVyKSBtcy5zZXJ2ZXIpLmdldE1vZHVsZVN0YXR1cyhtcy5tb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQkvKklTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIHNlcnZlcikuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JCQkJaWYgKGRlZmF1bHRTZXJ2ZXIgIT0gbnVsbCAmJiBkZWZhdWx0U2VydmVyLmVxdWFscyhzZXJ2ZXIpIHx8IHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCUltYWdlIGRlY29yYXRlZCA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCQkJaWYgKGRlY29yYXRlZCAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlY29yYXRlZDsKLQkJCQl9Ki8KLQkJCQkvL3JldHVybiBpbWFnZTsKLQkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIHNlcnZlcik7Ci0JCQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkZWM7Ci0JCQkJfQotCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vaWYgKHNlcnZlclR5cGUuZ2V0U2VydmVyU3RhdGVTZXQoKSA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX1BVQkxJU0hFRCkKLQkJCS8vCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldFNlcnZlclN0YXRlSW1hZ2Uoc2VydmVyKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gKChTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSBlbGVtZW50KS50ZXh0OwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlpZiAobXMubW9kdWxlID09IG51bGwpCi0JCQkJCXJldHVybiAiIjsKLQkJCQlpbnQgc2l6ZSA9IG1zLm1vZHVsZS5sZW5ndGg7Ci0JCQkJU3RyaW5nIG5hbWUgPSBtcy5tb2R1bGVbc2l6ZSAtIDFdLmdldE5hbWUoKTsKLQkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQobmFtZSwgbXMpOwotCQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGVjOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCS8vaWYgKG1zLnNlcnZlciA9PSBudWxsKQotCQkJCS8vCXJldHVybiAiIjsKLQkJCQkvL3JldHVybiBnZXRTdGF0ZUxhYmVsKG1zLnNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIG1zLnNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpLCBudWxsKTsKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoU2VydmVyKSBtcy5zZXJ2ZXIpLmdldE1vZHVsZVN0YXR1cyhtcy5tb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJCi0JCQkJcmV0dXJuIG1vZHVsZVB1Ymxpc2hTdGF0ZVttcy5zZXJ2ZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1zLm1vZHVsZSldOwotCQkJfQotCQl9Ci0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJcmV0dXJuIG5vdE51bGwoc2VydmVyLmdldE5hbWUoKSk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0U2VydmVyU3RhdGVMYWJlbChzZXJ2ZXIpOwotCQkJCi0JCQlyZXR1cm4gIiI7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgc2VydmVyKS5nZXRTZXJ2ZXJTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7Ci0JCQkKLQkJCS8vaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgPT0gbnVsbCkKLQkJCS8vCXJldHVybiBNZXNzYWdlcy52aWV3Tm9Db25maWd1cmF0aW9uIik7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQkJcmV0dXJuICIiOwotCQkJCi0JCQlTdHJpbmcgc2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJCWlmIChTZXJ2ZXJUYWJsZVZpZXdlci5wdWJsaXNoaW5nLmNvbnRhaW5zKHNlcnZlcklkKSkKLQkJCQlyZXR1cm4gc3luY1N0YXRlWzRdOwotCQkJCi0JCQkvLyByZXB1Ymxpc2gKLQkJCWludCBpID0gMDsKLQkJCWlmIChzZXJ2ZXIuc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQkJaWYgKCgoU2VydmVyKXNlcnZlcikuaXNQdWJsaXNoVW5rbm93bigpKQotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJaSArPSAyOwotCQkJfQotCQkJCi0JCQlpZiAoc2VydmVyLnNob3VsZFJlc3RhcnQoKSkKLQkJCQlpID0gMTsKLQkJCQotCQkJLy9JU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJCS8vIFRPRE86IHN0YXRlIHNldAotCQkJLy9pZiAoc2VydmVyVHlwZS5nZXRTZXJ2ZXJTdGF0ZVNldCgpID09IElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfTUFOQUdFRCkKLQkJCQlyZXR1cm4gc3luY1N0YXRlW2ldOwotCQkJLy9yZXR1cm4gc3luY1N0YXRlVW5tYW5hZ2VkW2ldOwotCQl9IGVsc2UKLQkJCXJldHVybiAiLSI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiBzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGUgc2VydmVyJ3Mgc3RhdGUuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFNlcnZlclN0YXRlSW1hZ2UoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIGdldFN0YXRlSW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKSwgc2VydmVyLmdldFNlcnZlclN0YXRlKCksIHNlcnZlci5nZXRNb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRTdGF0ZUltYWdlKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUsIGludCBzdGF0ZSwgU3RyaW5nIG1vZGUpIHsKLQkJcmV0dXJuIFVJRGVjb3JhdG9yTWFuYWdlci5nZXRVSURlY29yYXRvcihzZXJ2ZXJUeXBlKS5nZXRTdGF0ZUltYWdlKHN0YXRlLCBtb2RlLCBjb3VudCk7Ci0JCS8qaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7Ci0JCX0qLwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VydmVyJ3Mgc3RhdGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJTdGF0ZUxhYmVsKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRTdGF0ZUxhYmVsKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpLCBzZXJ2ZXIuZ2V0TW9kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RhdGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YXRlTGFiZWwoSVNlcnZlclR5cGUgc2VydmVyVHlwZSwgaW50IHN0YXRlLCBTdHJpbmcgbW9kZSkgewotCQlyZXR1cm4gVUlEZWNvcmF0b3JNYW5hZ2VyLmdldFVJRGVjb3JhdG9yKHNlcnZlclR5cGUpLmdldFN0YXRlTGFiZWwoc3RhdGUsIG1vZGUsIGNvdW50KTsKLQkJLyppZiAoc3RhdGVTZXQgPT0gSVNlcnZlclR5cGUuU0VSVkVSX1NUQVRFX1NFVF9QVUJMSVNIRUQpCi0JCQlyZXR1cm4gIiI7Ci0JCQotCQlpZiAoc3RhdGVTZXQgPT0gSVNlcnZlclR5cGUuU0VSVkVSX1NUQVRFX1NFVF9NQU5BR0VEKSB7Ci0JCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJCXJldHVybiAiIjsKLQkJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQkJcmV0dXJuIHN0YXJ0aW5nVGV4dFtjb3VudF07Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJCXJldHVybiBzdG9wcGluZ1RleHRbY291bnRdOwotCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWREZWJ1ZyIpOwotCQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGUiKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZCIpOwotCQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkIik7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXJ2ZXJTdGF0ZVVubWFuYWdlZFtzdGF0ZV07Ki8KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYW5pbWF0ZSgpIHsKLQkJY291bnQgKys7Ci0JCWlmIChjb3VudCA+IDIpCi0JCQljb3VudCA9IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTViYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIFRyZWUgdmlldyBzaG93aW5nIHNlcnZlcnMgYW5kIHRoZWlyIGFzc29jaWF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhYmxlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJyb290IjsKLQlwcm90ZWN0ZWQgc3RhdGljIENvbG9yIGNvbG9yOwotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBmb250OwotCXByb3RlY3RlZCBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJvdGVjdGVkIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBzZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyOwotCXByb3RlY3RlZCBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZGVsZXRlZEVsZW1lbnQgPSBudWxsOwotCi0JLy8gc2VydmVycyB0aGF0IGFyZSBjdXJyZW50bHkgcHVibGlzaGluZyBhbmQgc3RhcnRpbmcKLQlwcm90ZWN0ZWQgc3RhdGljIFNldDxTdHJpbmc+IHB1Ymxpc2hpbmcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDQpOwotCXByb3RlY3RlZCBzdGF0aWMgU2V0PFN0cmluZz4gc3RhcnRpbmcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDQpOwotCi0JcHJvdGVjdGVkIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCS8vcHJvdGVjdGVkIElTZWxlY3Rpb25MaXN0ZW5lciBkc0xpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFNlcnZlcnNWaWV3IHZpZXc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbmltYXRpb25BY3RpdmUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wQW5pbWF0aW9uID0gZmFsc2U7Ci0KLQlwdWJsaWMgY2xhc3MgU2VydmVyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKCEoKFNlcnZlcilzZXJ2ZXJzW2ldKS5pc1ByaXZhdGUoKSkKLQkJCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJCXRyeSB7Ci0JCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IG1zLnNlcnZlci5nZXRDaGlsZE1vZHVsZXMobXMubW9kdWxlLCBudWxsKTsKLQkJCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJCU1vZHVsZVNlcnZlcltdIG1zMiA9IG5ldyBNb2R1bGVTZXJ2ZXJbc2l6ZV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBtcy5tb2R1bGUubGVuZ3RoOwotCQkJCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1zLm1vZHVsZSwgMCwgbW9kdWxlLCAwLCBzaXplMik7Ci0JCQkJCQltb2R1bGVbc2l6ZTJdID0gY2hpbGRyZW5baV07Ci0JCQkJCQltczJbaV0gPSBuZXcgTW9kdWxlU2VydmVyKG1zLnNlcnZlciwgbW9kdWxlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbXMyOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsgCi0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQkJTW9kdWxlU2VydmVyW10gbXMgPSBuZXcgTW9kdWxlU2VydmVyW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQltc1tpXSA9IG5ldyBNb2R1bGVTZXJ2ZXIoc2VydmVyLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9KTsKLQkJCX0KLQkJCXJldHVybiBtczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIG1zLnNlcnZlcjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlIG1vZHVsZSBzZXJ2ZXIgaGFzIGNoaWxkIG1vZHVsZXMuCi0JCQkJTW9kdWxlU2VydmVyIGN1ck1vZHVsZVNlcnZlciA9IChNb2R1bGVTZXJ2ZXIpZWxlbWVudDsKLQkJCQlJU2VydmVyIGN1clNlcnZlciA9IGN1ck1vZHVsZVNlcnZlci5zZXJ2ZXI7Ci0JCQkJSU1vZHVsZVtdIGN1ck1vZHVsZSA9IGN1ck1vZHVsZVNlcnZlci5tb2R1bGU7Ci0JCQkJaWYgKGN1clNlcnZlciAhPSBudWxsICYmICBjdXJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gY3VyQ2hpbGRNb2R1bGUgPSBjdXJTZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKGN1ck1vZHVsZSwgbnVsbCk7Ci0JCQkJCWlmIChjdXJDaGlsZE1vZHVsZSAhPSBudWxsICYmIGN1ckNoaWxkTW9kdWxlLmxlbmd0aCA+IDApCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQkJcmV0dXJuIHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoID4gMDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0VGhyZWFkKCkgewotCQlpZiAoYW5pbWF0aW9uQWN0aXZlKQotCQkJcmV0dXJuOwotCQkKLQkJc3RvcEFuaW1hdGlvbiA9IGZhbHNlOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0VHJlZSgpLmdldERpc3BsYXkoKTsKLQkJZmluYWwgaW50IFNMRUVQID0gMjAwOwotCQlmaW5hbCBSdW5uYWJsZVtdIGFuaW1hdG9yID0gbmV3IFJ1bm5hYmxlWzFdOwotCQlhbmltYXRvclswXSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIXN0b3BBbmltYXRpb24pIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxhYmVsUHJvdmlkZXIuYW5pbWF0ZSgpOwotCQkJCQkJCi0JCQkJCQlpbnQgc2l6ZSA9IDA7Ci0JCQkJCQlTdHJpbmdbXSBzZXJ2ZXJzOwotCQkJCQkJc3luY2hyb25pemVkIChzdGFydGluZykgewotCQkJCQkJCXNpemUgPSBzdGFydGluZy5zaXplKCk7Ci0JCQkJCQkJc2VydmVycyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCQkJCQkJc3RhcnRpbmcudG9BcnJheShzZXJ2ZXJzKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJzW2ldKTsKLQkJCQkJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgZ2V0VHJlZSgpICE9IG51bGwgJiYgIWdldFRyZWUoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCXVwZGF0ZUFuaW1hdGlvbihzZXJ2ZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRXJyb3IgaW4gU2VydmVycyB2aWV3IGFuaW1hdGlvbiIsIGUpOwotCQkJCQl9Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKFNMRUVQLCBhbmltYXRvclswXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkudGltZXJFeGVjKFNMRUVQLCBhbmltYXRvclswXSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BUaHJlYWQoKSB7Ci0JCXN0b3BBbmltYXRpb24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNlcnZlclRhYmxlVmlld2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHZpZXcgdGhlIHZpZXcgCi0JICogQHBhcmFtIHRyZWUgdGhlIHRyZWUKLQkgKi8KLQlwdWJsaWMgU2VydmVyVGFibGVWaWV3ZXIoZmluYWwgU2VydmVyc1ZpZXcgdmlldywgZmluYWwgVHJlZSB0cmVlKSB7Ci0JCXN1cGVyKHRyZWUpOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRyZWUuZ2V0RGlzcGxheSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQuZW5hYmxlRm9yKHRoaXMpOwotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IFNlcnZlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIoKTsJCQotCQlzZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwkJCi0JCQotCQlzZXRDb21wYXJhdG9yKG5ldyBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yKGxhYmVsUHJvdmlkZXIpKTsKLQkJCi0JCXNldElucHV0KFJPT1QpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCi0JCS8qZHNMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJZmluYWwgT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQkJCXByb2ogPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQkJCQlpZiAocHJvaiA9PSBudWxsICYmIG9iaiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKG9iaiwgSVJlc291cmNlLmNsYXNzKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJCQlwcm9qID0gcmVzLmdldFByb2plY3QoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwcm9qICE9IG51bGwpIHsKLQkJCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByb2o7Ci0JCQkJCWZpbmFsIElNb2R1bGUgbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGdldFRyZWUoKSA9PSBudWxsIHx8IGdldFRyZWUoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCXJldHVybjsKLQotCQkJCQkJCUlTZXJ2ZXIgZGVmYXVsdFNlcnZlciA9IG51bGw7Ci0JCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCQkJCQlkZWZhdWx0U2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCQkJCQkJCi0JCQkJCQkJSVNlcnZlciBvbGREZWZhdWx0U2VydmVyID0gbGFiZWxQcm92aWRlci5nZXREZWZhdWx0U2VydmVyKCk7Ci0JCQkJCQkJaWYgKChvbGREZWZhdWx0U2VydmVyID09IG51bGwgJiYgZGVmYXVsdFNlcnZlciA9PSBudWxsKQotCQkJCQkJCQkJfHwgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCAmJiBvbGREZWZhdWx0U2VydmVyLmVxdWFscyhkZWZhdWx0U2VydmVyKSkpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlsYWJlbFByb3ZpZGVyLnNldERlZmF1bHRTZXJ2ZXIoZGVmYXVsdFNlcnZlcik7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJCQkJcmVmcmVzaChvbGREZWZhdWx0U2VydmVyKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFNlcnZlciAhPSBudWxsKQotCQkJCQkJCQlyZWZyZXNoKGRlZmF1bHRTZXJ2ZXIpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZHNMaXN0ZW5lcik7Ki8KLQkJCi0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQkJY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotCQkJRm9udERhdGFbXSBmZCA9IGdldENvbnRyb2woKS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJCWludCBzaXplID0gZmQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJZmRbaV0uc2V0U3R5bGUoU1dULklUQUxJQyk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3RbXSBvYmogPSBldmVudC5nZXRFbGVtZW50cygpOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZWZyZXNoKHRydWUpOwotCQllbHNlIHsKLQkJCW9iaiA9IGFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQl1cGRhdGUob2JqW2ldLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc29ydCB0aGUgdGFibGUgYmFzZWQgb24gZmllbGQuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbiB0aGUgY29sdW1uIGJlaW5nIHVwZGF0ZWQKLQkgKiBAcGFyYW0gY29sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3J0VGFibGUoZmluYWwgVHJlZUNvbHVtbiBjb2x1bW4sIGludCBjb2wpIHsKLQkJU2VydmVyVmlld2VyQ29tcGFyYXRvciBzb3J0ZXIgPSAoU2VydmVyVmlld2VyQ29tcGFyYXRvcikgZ2V0Q29tcGFyYXRvcigpOwotCQkKLQkJaWYgKGNvbCA9PSBzb3J0ZXIuZ2V0VG9wUHJpb3JpdHkoKSkKLQkJCXNvcnRlci5yZXZlcnNlVG9wUHJpb3JpdHkoKTsKLQkJZWxzZQotCQkJc29ydGVyLnNldFRvcFByaW9yaXR5KGNvbCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCXVwZGF0ZURpcmVjdGlvbkluZGljYXRvcihjb2x1bW4pOwotCQkJCX0KLQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZGlyZWN0aW9uIGluZGljYXRvciBhcyBjb2x1bW4gaXMgbm93IHRoZSBwcmltYXJ5IGNvbHVtbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlyZWN0aW9uSW5kaWNhdG9yKFRyZWVDb2x1bW4gY29sdW1uKSB7Ci0JCWdldFRyZWUoKS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JCWlmICgoKFNlcnZlclZpZXdlckNvbXBhcmF0b3IpIGdldENvbXBhcmF0b3IoKSkuZ2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oKSA9PSBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yLkFTQ0VORElORykKLQkJCWdldFRyZWUoKS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0JCWVsc2UKLQkJCWdldFRyZWUoKS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5ET1dOKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gYWRhcHRMYWJlbENoYW5nZU9iamVjdHMoT2JqZWN0W10gb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBvYmo7Ci0JCQotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAob2JqW2ldIGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIG9ialtpXTsKLQotCQkJCUxpc3Q8T2JqZWN0PiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCWdldFRyZWVDaGlsZHJlbihsaXN0Miwgdmlldy50cmVlVGFibGUpOwotCQkJCQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdDIuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgbzsKLQkJCQkJCWlmIChwcm9qLmVxdWFscyhtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdLmdldFByb2plY3QoKSkpCi0JCQkJCQkJbGlzdC5hZGQobXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlPYmplY3RbXSBvID0gbmV3IE9iamVjdFtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShvKTsKLQkJcmV0dXJuIG87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFRyZWVDaGlsZHJlbihMaXN0PE9iamVjdD4gbGlzdCwgV2lkZ2V0IHdpZGdldCkgewotCQlJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJCWxpc3QuYWRkKGRhdGEpOwotCQkJCi0JCQlpZiAoZ2V0RXhwYW5kZWQoaXRlbSkpIHsKLQkJCQkvLyBvbmx5IHJlY3Vyc2UgaWYgaXQgaXMgZXhwYW5kZWQgLSBpZgotCQkJCS8vIG5vdCB0aGVuIHRoZSBjaGlsZHJlbiBhcmVuJ3QgdmlzaWJsZQotCQkJCWdldFRyZWVDaGlsZHJlbihsaXN0LCBpdGVtKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc2VydmVyUmVzb3VyY2VMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCWFkZFNlcnZlcihzZXJ2ZXIpOwotCQkJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQkJcmVmcmVzaFNlcnZlcihzZXJ2ZXIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXJlbW92ZVNlcnZlcihzZXJ2ZXIpOwotCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyUmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQlwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoU3RhcnRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCB0cnVlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCBmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlzZXJ2ZXJMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCS8vIHNlcnZlciBjaGFuZ2UgZXZlbnQKLQkJCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpICE9IDApIHsKLQkJCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCQkJCWludCBzdGF0ZSA9IGV2ZW50LmdldFN0YXRlKCk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCQkJCQlib29sZWFuIHN0YXJ0VGhyZWFkID0gZmFsc2U7Ci0JCQkJCQkJc3luY2hyb25pemVkIChzdGFydGluZykgewotCQkJCQkJCQlpZiAoIXN0YXJ0aW5nLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmlzRW1wdHkoKSkKLQkJCQkJCQkJCQlzdGFydFRocmVhZCA9IHRydWU7Ci0JCQkJCQkJCQlzdGFydGluZy5hZGQoaWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzdGFydFRocmVhZCkKLQkJCQkJCQkJc3RhcnRUaHJlYWQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiBzdG9wVGhyZWFkID0gZmFsc2U7Ci0JCQkJCQkJc3luY2hyb25pemVkIChzdGFydGluZykgewotCQkJCQkJCQlpZiAoc3RhcnRpbmcuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJCQlzdGFydGluZy5yZW1vdmUoaWQpOwotCQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmlzRW1wdHkoKSkKLQkJCQkJCQkJCQlzdG9wVGhyZWFkID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc3RvcFRocmVhZCkKLQkJCQkJCQkJc3RvcFRocmVhZCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCQl9IGVsc2UgaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCS8vIG1vZHVsZSBjaGFuZ2UgZXZlbnQKLQkJCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpICE9IDAgfHwgKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXJzIHRvIHNlcnZlcnMKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VydmVyc1tpXS5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcnNbaV0pLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlcnZlcihmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlZnJlc2goc2VydmVyKTsKLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBTZXJ2ZXJUYWJsZVZpZXdlci50aGlzLmdldFNlbGVjdGlvbigpOwotCQkJCQlTZXJ2ZXJUYWJsZVZpZXdlci50aGlzLnNldFNlbGVjdGlvbihzZWwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJc3RvcFRocmVhZCgpOwotCQkvL2lmIChkc0xpc3RlbmVyICE9IG51bGwpCi0JCS8vCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoZHNMaXN0ZW5lcik7Ci0JCQotCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlclJlc291cmNlTGlzdGVuZXIpOwotCQkKLQkJLy8gcmVtb3ZlIGxpc3RlbmVycyBmcm9tIHNlcnZlcgotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoc2VydmVyTGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJc2VydmVyc1tpXS5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJaWYgKHB1Ymxpc2hMaXN0ZW5lciAhPSBudWxsKQotCQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHVibGlzaCBzdGF0ZSBjaGFuZ2VzLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdWJsaXNoQ2hhbmdlKElTZXJ2ZXIgc2VydmVyLCBib29sZWFuIGlzUHVibGlzaGluZykgewotCQlTdHJpbmcgc2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJaWYgKGlzUHVibGlzaGluZykKLQkJCXB1Ymxpc2hpbmcuYWRkKHNlcnZlcklkKTsKLQkJZWxzZQotCQkJcHVibGlzaGluZy5yZW1vdmUoc2VydmVySWQpOwotCQotCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlck1vZHVsZXNDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyMikgewotCQlpZiAoc2VydmVyMiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzZXJ2ZXIyLmVxdWFscyhzZXJ2ZXJzW2ldKSkKLQkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBhbiBlbGVtZW50IGlzIGFkZGVkLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWFkZChudWxsLCBzZXJ2ZXIpOwotCX0KLQkKLQkvKnByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQWRkZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uQ2hhbmdlKGNvbmZpZ3VyYXRpb24sIHRydWUpOwotCX0qLwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJlZnJlc2goc2VydmVyKTsKLQl9Ci0JCi0JLypwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUNoYW5nZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY29uZmlndXJhdGlvbi5lcXVhbHMoY29uZmlnKSkKLQkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCX0qLwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJlbW92ZShzZXJ2ZXIpOwotCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlwdWJsaXNoaW5nLnJlbW92ZShzZXJ2ZXJJZCk7Ci0KLQkJdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0JfQotCi0JLypwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZVJlbW92ZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uQ2hhbmdlKGNvbmZpZ3VyYXRpb24sIGZhbHNlKTsKLQl9Ki8KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZlcihmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZChST09ULCBzZXJ2ZXIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZW1vdmUoc2VydmVyKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtICYmIGNvbG9yICE9IG51bGwpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCQlJTW9kdWxlIG0gPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aC0xXTsKLQkJCQlpZiAobS5pc0V4dGVybmFsKCkpCi0JCQkJCWl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQkJZWxzZQotCQkJCQlpdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JCQkJaWYgKG1zLnNlcnZlci5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobXMubW9kdWxlKSAhPSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSkKLQkJCQkJaXRlbS5zZXRGb250KDAsIGZvbnQpOwotCQkJCWVsc2UKLQkJCQkJaXRlbS5zZXRGb250KDAsIG51bGwpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFuaW1hdGlvbihJU2VydmVyIHNlcnZlcikgewotCQl0cnkgewotCQkJV2lkZ2V0IHdpZGdldCA9IGRvRmluZEl0ZW0oc2VydmVyKTsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKLQkJCWl0ZW0uc2V0VGV4dCgxLCBsYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoc2VydmVyLCAxKSk7Ci0JCQlpdGVtLnNldEltYWdlKDEsIGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uoc2VydmVyLCAxKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW4gb3B0aW1pemVkIGFuaW1hdGlvbiIsIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUcmFuc2Zlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDNkYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlhNTE1lbWVudG87Ci0vKgotICogVGhlIGVsZW1lbnQgc2VyaWFsaXphdGlvbiBmb3JtYXQgaXM6Ci0gKiAgKGludCkgbnVtYmVyIG9mIHNlcnZlcnMKLSAqIFRoZW4sIHRoZSBmb2xsb3dpbmcgZm9yIGVhY2ggc2VydmVyOgotICogIChTdHJpbmcpIGlkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXJ2ZXJUcmFuc2ZlciBpbnN0YW5jZSA9IG5ldyBTZXJ2ZXJUcmFuc2ZlcigpOwotCi0JLy8gQ3JlYXRlIGEgdW5pcXVlIElEIHRvIG1ha2Ugc3VyZSB0aGF0IGRpZmZlcmVudCBFY2xpcHNlCi0JLy8gYXBwbGljYXRpb25zIHVzZSBkaWZmZXJlbnQgInR5cGVzIiBvZiA8Y29kZT5KYXZhRWxlbWVudFRyYW5zZmVyPC9jb2RlPgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAic2VydmVyLXRyYW5zZmVyLWZvcm1hdDoiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiOiIgKyBpbnN0YW5jZS5oYXNoQ29kZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVJRCA9IHJlZ2lzdGVyVHlwZShUWVBFX05BTUUpOwotCi0JcHJpdmF0ZSBTZXJ2ZXJUcmFuc2ZlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgVFlQRUlEIH07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBUcmFuc2Zlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgVFlQRV9OQU1FIH07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlciNqYXZhVG9OYXRpdmUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBkYXRhLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghKGRhdGEgaW5zdGFuY2VvZiBJU2VydmVyW10pKQotCQkJcmV0dXJuOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSAoSVNlcnZlcltdKSBkYXRhOwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInNlcnZlcnMiKTsKLQkJCQotCQkJLy8gd3JpdGUgZWFjaCBlbGVtZW50Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInNlcnZlciIpOwotCQkJCSgoU2VydmVyKXNlcnZlcnNbaV0pLnNlcmlhbGl6ZShjaGlsZCk7Ci0JCQl9Ci0JCQkKLQkJCW1lbWVudG8uc2F2ZShvdXQpOwotCQkJCi0JCQkvLyBjbGVhbnVwCi0JCQlvdXQuY2xvc2UoKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ5dGVzLCB0cmFuc2ZlckRhdGEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpdCdzIGJlc3QgdG8gc2VuZCBub3RoaW5nIGlmIHRoZXJlIHdlcmUgcHJvYmxlbXMKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXIjbmF0aXZlVG9KYXZhKG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCWlmIChieXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJzZXJ2ZXIiKTsKLQkJCQotCQkJaW50IGNvdW50ID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJSVNlcnZlcltdIHJlc3VsdHMgPSBuZXcgSVNlcnZlcltjb3VudF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcihudWxsKTsKLQkJCQlzZXJ2ZXIuZGVzZXJpYWxpemUoY2hpbGRyZW5baV0pOwotCQkJCXJlc3VsdHNbaV0gPSBzZXJ2ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclZpZXdlckNvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGIzMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclZpZXdlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yIGV4dGVuZHMgVmlld2VyQ29tcGFyYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RFUFRIID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0NFTkRJTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NFTkRJTkcgPSAtMTsKLQotCXByb3RlY3RlZCBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByb3RlY3RlZCBpbnRbXSBwcmlvcml0aWVzID0gbmV3IGludFtdIHsgMCB9OwotCi0JcHJvdGVjdGVkIGludFtdIGRpcmVjdGlvbnMgPSBuZXcgaW50W10geyBBU0NFTkRJTkcgfTsKLQotCXB1YmxpYyBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yKFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9wUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0JCWlmIChwcmlvcml0aWVzWzBdID09IHByaW9yaXR5KQotCQkJcmV0dXJuOwotCQkKLQkJaW50IGxlbiA9IHByaW9yaXRpZXMubGVuZ3RoICsgMTsKLQkJaWYgKGxlbiA+IE1BWF9ERVBUSCkKLQkJCWxlbiA9IE1BWF9ERVBUSDsKLQkJCi0JCWludFtdIHRlbXAgPSBuZXcgaW50W2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJpb3JpdGllcywgMCwgdGVtcCwgMSwgbGVuIC0gMSk7Ci0JCXRlbXBbMF0gPSBwcmlvcml0eTsKLQkJcHJpb3JpdGllcyA9IHRlbXA7Ci0JCQotCQl0ZW1wID0gbmV3IGludFtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRpcmVjdGlvbnMsIDAsIHRlbXAsIDEsIGxlbiAtIDEpOwotCQl0ZW1wWzBdID0gQVNDRU5ESU5HOwotCQlkaXJlY3Rpb25zID0gdGVtcDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvcFByaW9yaXR5KCkgewotCQlyZXR1cm4gcHJpb3JpdGllc1swXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3BQcmlvcml0eURpcmVjdGlvbihpbnQgZGlyZWN0aW9uKSB7Ci0JCWlmIChkaXJlY3Rpb24gPT0gQVNDRU5ESU5HIHx8IGRpcmVjdGlvbiA9PSBERVNDRU5ESU5HKSB7Ci0JCQlkaXJlY3Rpb25zWzBdID0gZGlyZWN0aW9uOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRUb3BQcmlvcml0eURpcmVjdGlvbigpIHsKLQkJcmV0dXJuIGRpcmVjdGlvbnNbMF07Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJzZVRvcFByaW9yaXR5KCkgewotCQlkaXJlY3Rpb25zWzBdICo9IC0xOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMiwgaW50IGEpIHsKLQkJaW50IGNvbCA9IHByaW9yaXRpZXNbYV07Ci0JCQotCQlTdHJpbmcgczEgPSBsYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZTEsIGNvbCk7Ci0JCVN0cmluZyBzMiA9IGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlMiwgY29sKTsKLQkJCi0JCWludCBzID0gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMikgKiBkaXJlY3Rpb25zW2FdOwotCQlpZiAocyA9PSAwKSB7Ci0JCQlpZiAoYSA9PSBwcmlvcml0aWVzLmxlbmd0aCAtIDEpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gY29tcGFyZSh2aWV3ZXIsIGUxLCBlMiwgYSsxKTsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIGNvbXBhcmUodmlld2VyLCBlMSwgZTIsIDApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg3OWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVXBkYXRlU2VydmVySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld1NlcnZlcldpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5JQ29udGV4dFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci0vKioKLSAqIEEgdmlldyBvZiBzZXJ2ZXJzLCB0aGVpciBtb2R1bGVzLCBhbmQgc3RhdHVzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xVTU5fV0lEVEggPSAiY29sdW1uV2lkdGgiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJTX1ZJRVdfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5zZXJ2ZXJWaWV3U2NvcGUiOwotCi0JcHJvdGVjdGVkIEFjdGlvbiBub25lQWN0aW9uID0gbmV3IEFjdGlvbihNZXNzYWdlcy5kaWFsb2dNb25pdG9yTm9uZSkgewotCQkvLyBkdW1teSBhY3Rpb24KLQl9OwotCi0JcHJvdGVjdGVkIGludFtdIGNvbHM7Ci0KLQlwcm90ZWN0ZWQgVHJlZSB0cmVlVGFibGU7Ci0JcHJvdGVjdGVkIFNlcnZlclRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JLy8gYWN0aW9ucyBvbiBhIHNlcnZlcgotCXByb3RlY3RlZCBBY3Rpb25bXSBhY3Rpb25zOwotCXByb3RlY3RlZCBBY3Rpb24gYWN0aW9uTW9kaWZ5TW9kdWxlczsKLQlwcm90ZWN0ZWQgQWN0aW9uIG9wZW5BY3Rpb24sIHNob3dJbkNvbnNvbGVBY3Rpb24sIHNob3dJbkRlYnVnQWN0aW9uLCBwcm9wZXJ0aWVzQWN0aW9uLCBtb25pdG9yUHJvcGVydGllc0FjdGlvbjsKLQlwcm90ZWN0ZWQgQWN0aW9uIGNvcHlBY3Rpb24sIHBhc3RlQWN0aW9uLCBkZWxldGVBY3Rpb24sIHJlbmFtZUFjdGlvbjsKLQotCS8qKgotCSAqIFNlcnZlcnNWaWV3IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlcnNWaWV3KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRIZWFkZXJMaXN0ZW5lcihmaW5hbCBpbnQgY29sKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCS8qKgotCQkJICogSGFuZGxlcyB0aGUgY2FzZSBvZiB1c2VyIHNlbGVjdGluZyB0aGUgaGVhZGVyIGFyZWEuCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCVRyZWVDb2x1bW4gY29sdW1uID0gKFRyZWVDb2x1bW4pIGUud2lkZ2V0OwotCQkJCXRhYmxlVmlld2VyLnJlc29ydFRhYmxlKGNvbHVtbiwgY29sKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVQYXJ0Q29udHJvbCBtZXRob2QgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZVRhYmxlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdHJlZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWVUYWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCQl0cmVlVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWVUYWJsZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRyZWVUYWJsZSwgQ29udGV4dElkcy5WSUVXX1NFUlZFUlMpOwotCQkKLQkJLy8gYWRkIGNvbHVtbnMKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlVGFibGUsIFNXVC5TSU5HTEUpOwotCQljb2x1bW4uc2V0VGV4dChNZXNzYWdlcy52aWV3U2VydmVyKTsKLQkJY29sdW1uLnNldFdpZHRoKGNvbHNbMF0pOwotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0SGVhZGVyTGlzdGVuZXIoMCkpOwotCQl0cmVlVGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4pOwotCQl0cmVlVGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOwotCQkKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uMi5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTdGF0ZSk7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoY29sc1sxXSk7Ci0JCWNvbHVtbjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0SGVhZGVyTGlzdGVuZXIoMSkpOwotCQkKLQkJVHJlZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uMy5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTdGF0dXMpOwotCQljb2x1bW4zLnNldFdpZHRoKGNvbHNbMl0pOwotCQljb2x1bW4zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldEhlYWRlckxpc3RlbmVyKDIpKTsKLQkJCi0JCUlDb250ZXh0U2VydmljZSBjb250ZXh0U3VwcG9ydCA9IChJQ29udGV4dFNlcnZpY2UpZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQkJY29udGV4dFN1cHBvcnQuYWN0aXZhdGVDb250ZXh0KFNFUlZFUlNfVklFV19DT05URVhUKTsKLQkJCi0JCWRlZmVySW5pdGlhbGl6YXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlVGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdJbml0aWFsaXppbmcpOwotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgU2VydmVyVGFibGVWaWV3ZXIodGhpcywgdHJlZVRhYmxlKTsKLQkJaW5pdGlhbGl6ZUFjdGlvbnModGFibGVWaWV3ZXIpOwotCQkKLQkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJKChTZXJ2ZXIpc2VydmVyc1tpXSkuZ2V0QWxsTW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQkJCS8qd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCW1vZHVsZS5nCi0JCQkJCX0qLwotCQkJCX0KLQkJCQkKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlZmVycmVkSW5pdGlhbGl6ZSgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUgLSB2aWV3IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWZlcnJlZEluaXRpYWxpemUoKSB7Ci0JCXRhYmxlVmlld2VyLmluaXRpYWxpemUoKTsKLQkJdGFibGVWaWV3ZXIuYWRkT3Blbkxpc3RlbmVyKG5ldyBJT3Blbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQlPYmplY3QgZGF0YSA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKCEoZGF0YSBpbnN0YW5jZW9mIElTZXJ2ZXIpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBkYXRhOwotCQkJCQlTZXJ2ZXJVSVBsdWdpbi5lZGl0U2VydmVyKHNlcnZlcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gc2VydmVyIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7Ci0JCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSB0cmVlVGFibGUuZ2V0U2hlbGwoKTsKLQkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKLQkJCQlmaWxsQ29udGV4dE1lbnUoc2hlbGwsIG1ncik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVGFibGUpOwotCQl0cmVlVGFibGUuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHRhYmxlVmlld2VyKTsKLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHRhYmxlVmlld2VyKTsKLQkJCi0JCWluaXREcmFnQW5kRHJvcCgpOwotCQkKLQkJLy8gaW5pdCB0aGUgdG9vbHRpcAotCQlTZXJ2ZXJUb29sVGlwIHRvb2xUaXAgPSBuZXcgU2VydmVyVG9vbFRpcCh0cmVlVGFibGUpOwotCQl0b29sVGlwLnNldFNoaWZ0KG5ldyBQb2ludCgxMCwgMykpOwotCQl0b29sVGlwLnNldFBvcHVwRGVsYXkoNDAwKTsgLy8gaW4gbXMKLQkJdG9vbFRpcC5zZXRIaWRlT25Nb3VzZURvd24odHJ1ZSk7Ci0JCXRvb2xUaXAuYWN0aXZhdGUoKTsKLQkJCi0JCWlmICh0YWJsZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQlPYmplY3Qgb2JqID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW0oMCkuZ2V0RGF0YSgpOwotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iaikpOwotCQl9Ci0JCQotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJU2VydmVyIHNlcnZlciA9IHNlcnZlcnNbaV07Ci0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSB7Ci0JCQkJCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihzZXJ2ZXIpOwotCQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZICsgMSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7Ci0JCWNvbHMgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJY29sc1tpXSA9IDIwMDsKLQkJCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCQlJbnRlZ2VyIGluID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19DT0xVTU5fV0lEVEggKyBpKTsKLQkJCQlpZiAoaW4gIT0gbnVsbCAmJiBpbi5pbnRWYWx1ZSgpID4gNSkKLQkJCQkJY29sc1tpXSA9IGluLmludFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlUcmVlQ29sdW1uW10gdGMgPSB0cmVlVGFibGUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaW50IHdpZHRoID0gdGNbaV0uZ2V0V2lkdGgoKTsKLQkJCWlmICh3aWR0aCAhPSAwKQotCQkJCW1lbWVudG8ucHV0SW50ZWdlcihUQUdfQ09MVU1OX1dJRFRIICsgaSwgd2lkdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhY3Rpb25zCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFjdGlvbnMoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJCi0JCWFjdGlvbnMgPSBuZXcgQWN0aW9uWzZdOwotCQkvLyBjcmVhdGUgdGhlIHN0YXJ0IGFjdGlvbnMKLQkJYWN0aW9uc1swXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciLCBhY3Rpb25zWzBdKTsKLQkJYWN0aW9uc1sxXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJ1biIsIGFjdGlvbnNbMV0pOwotCQlhY3Rpb25zWzJdID0gbmV3IFN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgc3RvcCBhY3Rpb24KLQkJYWN0aW9uc1szXSA9IG5ldyBTdG9wQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIiwgYWN0aW9uc1szXSk7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIHB1Ymxpc2ggYWN0aW9ucwotCQlhY3Rpb25zWzRdID0gbmV3IFB1Ymxpc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giLCBhY3Rpb25zWzRdKTsKLQkJYWN0aW9uc1s1XSA9IG5ldyBQdWJsaXNoQ2xlYW5BY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgb3BlbiBhY3Rpb24KLQkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuQWN0aW9uKHByb3ZpZGVyKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuT3BlbiIsIG9wZW5BY3Rpb24pOwotCQkKLQkJLy8gY3JlYXRlIGNvcHksIHBhc3RlLCBhbmQgZGVsZXRlIGFjdGlvbnMKLQkJcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCB0YWJsZVZpZXdlci5jbGlwYm9hcmQpOwotCQljb3B5QWN0aW9uID0gbmV3IENvcHlBY3Rpb24ocHJvdmlkZXIsIHRhYmxlVmlld2VyLmNsaXBib2FyZCwgcGFzdGVBY3Rpb24pOwotCQlkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCXJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oc2hlbGwsIHRhYmxlVmlld2VyLCBwcm92aWRlcik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weUFjdGlvbik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlQWN0aW9uKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZUFjdGlvbik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFTkFNRS5nZXRJZCgpLCByZW5hbWVBY3Rpb24pOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBvdGhlciBhY3Rpb25zCi0JCWFjdGlvbk1vZGlmeU1vZHVsZXMgPSBuZXcgTW9kdWxlU2xvc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJc2hvd0luQ29uc29sZUFjdGlvbiA9IG5ldyBTaG93SW5Db25zb2xlQWN0aW9uKHByb3ZpZGVyKTsKLQkJc2hvd0luRGVidWdBY3Rpb24gPSBuZXcgU2hvd0luRGVidWdBY3Rpb24ocHJvdmlkZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBwcm9wZXJ0aWVzIGFjdGlvbgotCQlwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnRpZXNBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJbW9uaXRvclByb3BlcnRpZXNBY3Rpb24gPSBuZXcgUHJvcGVydGllc0FjdGlvbihzaGVsbCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcy5tb25pdG9yIiwgcHJvdmlkZXIpOwotCQkKLQkJLy8gYWRkIHRvb2xiYXIgYnV0dG9ucwotCQlJQ29udHJpYnV0aW9uTWFuYWdlciBjbSA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGggLSAxOyBpKyspCi0JCQljbS5hZGQoYWN0aW9uc1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsTmV3Q29udGV4dE1lbnUoU2hlbGwgc2hlbGwsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlJQWN0aW9uIG5ld1NlcnZlckFjdGlvbiA9IG5ldyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oKTsKLQkJbmV3U2VydmVyQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uTmV3U2VydmVyKTsKLQkJbWVudS5hZGQobmV3U2VydmVyQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoU2hlbGwgc2hlbGwsIElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGdldCBzZWxlY3Rpb24gYnV0IGF2b2lkIG5vIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQlJTW9kdWxlW10gbW9kdWxlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJCXNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOwotCQkJCXNlcnZlciA9IG1zLnNlcnZlcjsKLQkJCQltb2R1bGUgPSBtcy5tb2R1bGU7Ci0JCQl9Ci0JCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCQltb2R1bGUgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvLyBuZXcgYWN0aW9uCi0JCU1lbnVNYW5hZ2VyIG5ld01lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uTmV3KTsKLQkJZmlsbE5ld0NvbnRleHRNZW51KG51bGwsIHNlbGVjdGlvbiwgbmV3TWVudSk7Ci0JCW1lbnUuYWRkKG5ld01lbnUpOwotCQkKLQkJLy8gb3BlbiBhY3Rpb24KLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSA9PSBudWxsKSB7Ci0JCQltZW51LmFkZChvcGVuQWN0aW9uKTsKLQkJCQotCQkJU3RyaW5nIHRleHQgPSBNZXNzYWdlcy5hY3Rpb25TaG93SW47Ci0JCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2gKLQkJCQkJLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ1NlcnZpY2UKLQkJCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5zaG93SW5RdWlja01lbnUiKTsKLQkJCWlmIChhY3RpdmVCaW5kaW5ncy5sZW5ndGggPiAwKSB7Ci0JCQkJdGV4dCArPSAiXHQiICsgYWN0aXZlQmluZGluZ3NbMF0uZm9ybWF0KCk7Ci0JCQl9Ci0JCQkKLQkJCU1lbnVNYW5hZ2VyIHNob3dJbk1lbnUgPSBuZXcgTWVudU1hbmFnZXIodGV4dCk7Ci0JCQlzaG93SW5NZW51LmFkZChzaG93SW5Db25zb2xlQWN0aW9uKTsKLQkJCXNob3dJbk1lbnUuYWRkKHNob3dJbkRlYnVnQWN0aW9uKTsKLQkJCS8vSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQkJLy9hY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoImdyb3VwLnNob3ciLCBzaG93SW5NZW51KTsKLQkJCW1lbnUuYWRkKHNob3dJbk1lbnUpOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfSBlbHNlCi0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlpZiAobW9kdWxlID09IG51bGwpIHsKLQkJCQltZW51LmFkZChjb3B5QWN0aW9uKTsKLQkJCQltZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0JCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJCQltZW51LmFkZChyZW5hbWVBY3Rpb24pOwotCQkJfSBlbHNlIGlmIChtb2R1bGUubGVuZ3RoID09IDEpCi0JCQkJbWVudS5hZGQobmV3IFJlbW92ZU1vZHVsZUFjdGlvbihzaGVsbCwgc2VydmVyLCBtb2R1bGVbMF0pKTsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgPT0gbnVsbCkgewotCQkJLy8gc2VydmVyIGFjdGlvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLQkJCQltZW51LmFkZChhY3Rpb25zW2ldKTsKLQkJCQotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYWRkKGFjdGlvbk1vZGlmeU1vZHVsZXMpOwotCQkJCi0JCQkvLyBtb25pdG9yCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uTW9uaXRvcik7Ci0JCQkJCi0JCQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIyID0gc2VydmVyOwotCQkJCWZpbmFsIFNoZWxsIHNoZWxsMiA9IHNoZWxsOwotCQkJCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCQltZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCQkJCWlmIChzZXJ2ZXIyLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCQkJCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIyLmdldFNlcnZlclBvcnRzKG51bGwpOwotCQkJCQkJCWlmIChwb3J0cyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBzaXplID0gcG9ydHMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCQkJaWYgKCFwb3J0c1tpXS5pc0FkdmFuY2VkKCkpCi0JCQkJCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbihzaGVsbDIsIHNlcnZlcjIsIHBvcnRzW2ldKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChtZW51TWFuYWdlci5pc0VtcHR5KCkpCi0JCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOwotCQkJCQkJCi0JCQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQkJCW1lbnVNYW5hZ2VyLmFkZChtb25pdG9yUHJvcGVydGllc0FjdGlvbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQkvLyBhZGQgYW4gaW5pdGlhbCBtZW51IGl0ZW0gc28gdGhhdCB0aGUgbWVudSBhcHBlYXJzIGNvcnJlY3RseQotCQkJCW5vbmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOwotCQkJCW1lbnUuYWRkKG1lbnVNYW5hZ2VyKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudS5hZGQobmV3IFN0YXJ0TW9kdWxlQWN0aW9uKHNlcnZlciwgbW9kdWxlKSk7Ci0JCQltZW51LmFkZChuZXcgU3RvcE1vZHVsZUFjdGlvbihzZXJ2ZXIsIG1vZHVsZSkpOwkJCQotCQkJbWVudS5hZGQobmV3IFJlc3RhcnRNb2R1bGVBY3Rpb24oc2VydmVyLCBtb2R1bGUpKTsKLQkJfQotCQkKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIikpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHRyZWVUYWJsZSAhPSBudWxsKQotCQkJdHJlZVRhYmxlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0gICAgKiBBZGRzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCB0byB0aGUgU2VydmVycyB2aWV3LgotICAgICovCi0gICBwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7Ci0JCWludCBvcHMgPSBETkQuRFJPUF9DT1BZOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQkvL3RhYmxlVmlld2VyLmFkZERyYWdTdXBwb3J0KG9wcywgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdGFibGVWaWV3ZXIuYWRkRHJvcFN1cHBvcnQob3BzIHwgRE5ELkRST1BfREVGQVVMVCwgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcm9wQWRhcHRlcih0YWJsZVZpZXdlcikpOwotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2IzNDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyc1ZpZXdEcm9wQWRhcHRlciBleHRlbmRzIFZpZXdlckRyb3BBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgU2VydmVyc1ZpZXdEcm9wQWRhcHRlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHZpZXdlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCi0JCXN1cGVyLmRyYWdFbnRlcihldmVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybURyb3AoT2JqZWN0IGRhdGEpIHsKLQkJT2JqZWN0IHRhcmdldCA9IGdldEN1cnJlbnRUYXJnZXQoKTsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCXNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZGF0YTsKLQkJCWl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JCWlmIChpdGVyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJYm9vbGVhbiBiID0gdHJ1ZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGRhdGEyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFkb1NlbChzZXJ2ZXIsIGRhdGEyKSkKLQkJCQliID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9TZWwoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBkYXRhKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBzZWxlY3Rpb24gaXMgYSBwcm9qZWN0IChtb2R1bGUpIHRoYXQgd2UgY2FuIGFkZCB0byB0aGUgc2VydmVyCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihkYXRhLCBJUHJvamVjdC5jbGFzcyk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQkJaWYgKG1vZHVsZXMgIT0gbnVsbCAmJiBtb2R1bGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gd2MuZ2V0Um9vdE1vZHVsZXMobW9kdWxlc1swXSwgbnVsbCk7Ci0JCQkJCWlmIChwYXJlbnRzID09IG51bGwgfHwgcGFyZW50cy5sZW5ndGggPT0gMCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCi0JCQkJCWlmIChTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgcGFyZW50c1swXSwgbnVsbCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQotCQkJCQlJTW9kdWxlW10gYWRkID0gbmV3IElNb2R1bGVbXSB7IHBhcmVudHNbMF0gfTsKLQkJCQkJaWYgKHdjLmNhbk1vZGlmeU1vZHVsZXMoYWRkLCBudWxsLCBudWxsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCXdjLm1vZGlmeU1vZHVsZXMobW9kdWxlcywgbnVsbCwgbnVsbCk7Ci0JCQkJCQl3Yy5zYXZlKGZhbHNlLCBudWxsKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3Ioc2hlbGwsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSwgdHJ5IFJ1biBvbiBTZXJ2ZXIKLQkJZmluYWwgSVNlcnZlciBmaW5hbFNlcnZlciA9IHNlcnZlcjsKLQkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSByb3MgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZiAoIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKGZpbmFsU2VydmVyLCBsYXVuY2hNb2RlKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJaWYgKCFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGZpbmFsU2VydmVyLCBtb2R1bGUsIG1vbml0b3IpKSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IGZpbmFsU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXRocm93IGNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmaW5hbFNlcnZlcjsKLQkJCX0KLQkJfTsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQkvLwotCQl9OwotCQlyb3Muc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEpKTsKLQkJCi0JCS8vaWYgKCFhY3Rpb24uaXNFbmFibGVkKCkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJCi0JCXJvcy5ydW4oYWN0aW9uKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvKklTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElTZXJ2ZXIpCi0JCQlzZXJ2ZXIgPSAoSVNlcnZlcikgdGFyZ2V0OyovCi0JCS8vaWYgKCFTZXJ2ZXJVSVBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdCh0YXJnZXQpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkRyb3AgdGFyZ2V0OiAiICsgdGFyZ2V0ICsgIiAiICsgb3BlcmF0aW9uICsgIiAiICsgdHJhbnNmZXJUeXBlKTsKLQkJCi0JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLSAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gZnJvbSB0aGUgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcgotICAgICovCi0gICAvKnByaXZhdGUgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgQXJyYXlMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzc2VsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKG8pOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGEgPSAoSUFkYXB0YWJsZSkgbzsKLSAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGEuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKHIpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gKElSZXNvdXJjZVtdKSBzZWxlY3RlZFJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2Vbc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0gICB9Ki8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbkNvbnNvbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwYmY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogIlNob3cgaW4gQ29uc29sZSIgbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SW5Db25zb2xlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCS8qKgotCSAqIFNob3dJbkNvbnNvbGVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICovCi0JcHVibGljIFNob3dJbkNvbnNvbGVBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7Ci0JCXN1cGVyKHNwLCAiQ29uc29sZSIpOwotCQkKLQkJSVZpZXdSZWdpc3RyeSByZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFZpZXdSZWdpc3RyeSgpOwotCQlJVmlld0Rlc2NyaXB0b3IgZGVzYyA9IHJlZy5maW5kKElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7Ci0JCXNldFRleHQoZGVzYy5nZXRMYWJlbCgpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCUlMYXVuY2ggbGF1bmNoID0gc2VydmVyLmdldExhdW5jaCgpOwotCQkJc2VsZWN0UHJvY2VzcyhsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBjb25zb2xlIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKLQkJSUNvbnNvbGVNYW5hZ2VyIGNvbnNvbGVNYW5hZ2VyID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKTsKLQkJSUNvbnNvbGVbXSBjb25zb2xlcyA9IGNvbnNvbGVNYW5hZ2VyLmdldENvbnNvbGVzKCk7Ci0JCWludCBzaXplID0gY29uc29sZXMubGVuZ3RoOwotCQlJQ29uc29sZSBjb25zb2xlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChjb25zb2xlc1tpXSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlIGNvbiA9IChvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlKSBjb25zb2xlc1tpXTsKLQkJCQlpZiAocHJvY2Vzcy5lcXVhbHMoY29uLmdldFByb2Nlc3MoKSkpCi0JCQkJCWNvbnNvbGUgPSBjb25zb2xlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvbnNvbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSA7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhZ2UuZmluZFZpZXcoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLQkJCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJ0ID0gcGFnZS5zaG93VmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgb3BlbiBjb25zb2xlIHZpZXciKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCUlDb25zb2xlVmlldyB2aWV3ID0gKElDb25zb2xlVmlldykgcGFydC5nZXRBZGFwdGVyKElDb25zb2xlVmlldy5jbGFzcyk7Ci0JCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCXZpZXcuc2V0Rm9jdXMoKTsKLQkJCQkJCXZpZXcuZGlzcGxheShjb25zb2xlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luRGVidWdBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5EZWJ1Z0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQyY2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5EZWJ1Z0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqICJTaG93IGluIENvbnNvbGUiIG1lbnUgYWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luRGVidWdBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JLyoqCi0JICogU2hvd0luQ29uc29sZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgU2hvd0luRGVidWdBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7Ci0JCXN1cGVyKHNwLCAiQ29uc29sZSEiKTsKLQkJCi0JCUlWaWV3UmVnaXN0cnkgcmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRWaWV3UmVnaXN0cnkoKTsKLQkJSVZpZXdEZXNjcmlwdG9yIGRlc2MgPSByZWcuZmluZChJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJc2V0VGV4dChkZXNjLmdldExhYmVsKCkpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYy5nZXRJbWFnZURlc2NyaXB0b3IoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQl0cnkgewotCQkJSUxhdW5jaCBsYXVuY2ggPSBzZXJ2ZXIuZ2V0TGF1bmNoKCk7Ci0JCQlzZWxlY3RQcm9jZXNzKGxhdW5jaC5nZXRQcm9jZXNzZXMoKVswXSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzaG93aW5nIGluIGRlYnVnIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJ0ID0gcGFnZS5zaG93VmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gZGVidWcgdmlldyIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQkJSURlYnVnVmlldyB2aWV3ID0gKElEZWJ1Z1ZpZXcpcGFydC5nZXRBZGFwdGVyKElEZWJ1Z1ZpZXcuY2xhc3MpOwotCQkJCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJCQl2aWV3LnNldEZvY3VzKCk7Ci0JCQkJCQlWaWV3ZXIgdmlld2VyID0gdmlldy5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvY2VzcykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5NZW51QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luTWVudUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY2NjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5NZW51QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiAiU2hvd0luTWVudUFjdGlvbiIgbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SW5NZW51QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkvKioKLQkgKiBTaG93SW5NZW51QWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzcCBhIHNlbGVjdGlvbiBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBTaG93SW5NZW51QWN0aW9uKGZpbmFsIElTZWxlY3Rpb25Qcm92aWRlciBzcCkgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25TaG93SW4pOwotCQkKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5zaG93SW5RdWlja01lbnUiKTsKLQkJc2V0TWVudUNyZWF0b3IobmV3IElNZW51Q3JlYXRvcigpIHsKLQkJCXByaXZhdGUgTWVudU1hbmFnZXIgbWVudU1hbmFnZXI7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCWlmIChtZW51TWFuYWdlciAhPSBudWxsKQotCQkJCQltZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIG1lbnUxIik7Ci0JCQkJcmV0dXJuIGdldE1lbnVNYW5hZ2VyKCkuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKLQkJCX0KLQotCQkJcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgbWVudTIiKTsKLQkJCQkvL3JldHVybiBnZXRNZW51TWFuYWdlcigpLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSBNZW51TWFuYWdlciBnZXRNZW51TWFuYWdlcigpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIG1lbnUiKTsKLQkJCQlpZiAobWVudU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG1lbnVNYW5hZ2VyOwotCQkJCQotCQkJCW1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvblNob3dJbik7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTaG93SW5Db25zb2xlQWN0aW9uKHNwKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTaG93SW5EZWJ1Z0FjdGlvbihzcCkpOwotCQkJCXJldHVybiBtZW51TWFuYWdlcjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjdmMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuVUlEZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTdGFydCBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotCQotCXB1YmxpYyBTdGFydEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsICJzdGFydCIpOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQlpZiAobGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkgewotCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnRUb29sVGlwKTsKLQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlQpKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlQpKTsKLQkJCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iKTsKLQkJfSBlbHNlIGlmIChsYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpIHsKLQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnVG9vbFRpcCk7Ci0JCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciKTsKLQkJfSBlbHNlIGlmIChsYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkgewotCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZVRvb2xUaXApOwotCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX1BST0ZJTEUpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbmFtZSBvZiB0aGUgQWN0aW9uIGxhYmVsLCBkZXBlbmRpbmcgb24gdGhlIHN0YXR1cyBvZiB0aGUgc2VydmVyLgotCSAqIEBwYXJhbSBzZWwgdGhlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZyb20gdGhlIHZpZXcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGV4dChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpewotCQlpZiAodGhpcy5sYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKSB7Ci0JCQlpZiAoc2VsLmlzRW1wdHkoKSkgewotCQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwKLQkJCQkJCSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnQpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUmVzdGFydFRvb2xUaXApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydCk7Ci0JCQkJCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydFRvb2xUaXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSBlbHNlIGlmICh0aGlzLmxhdW5jaE1vZGUgPT0gSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkgewotCQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8Ci0JCQkJCQkgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgewotCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Jlc3RhcnQpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWdSZXN0YXJ0VG9vbFRpcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnVG9vbFRpcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGhpcy5sYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkgewotCQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwKLQkJCQkJCSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVSZXN0YXJ0KTsKLQkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVSZXN0YXJ0VG9vbFRpcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGUpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZVRvb2xUaXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsgLy8gc3RhcnQKLQkJCXJldHVybiBzZXJ2ZXIuY2FuU3RhcnQobGF1bmNoTW9kZSkuaXNPSygpOwotCQl9Ci0JCS8vIHJlc3RhcnQKLQkJU3RyaW5nIG1vZGUyID0gbGF1bmNoTW9kZTsKLQkJaWYgKG1vZGUyID09IG51bGwpCi0JCQltb2RlMiA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgVUlEZWNvcmF0b3JNYW5hZ2VyLmdldFVJRGVjb3JhdG9yKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkpLmNhblJlc3RhcnQoKSAmJiBzZXJ2ZXIuY2FuUmVzdGFydChtb2RlMikuaXNPSygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN0YXJ0KHNlcnZlciwgbGF1bmNoTW9kZSwgc2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydChJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUsIGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8qZmluYWwgSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJCXJldHVybiBzaGVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsqLwotCQkJc2VydmVyLnN0YXJ0KGxhdW5jaE1vZGUsIChJT3BlcmF0aW9uTGlzdGVuZXIpbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxhdW5jaE1vZGUyID0gbGF1bmNoTW9kZTsKLQkJCQlpZiAobGF1bmNoTW9kZTIgPT0gbnVsbCkKLQkJCQkJbGF1bmNoTW9kZTIgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJCXNlcnZlci5yZXN0YXJ0KGxhdW5jaE1vZGUyLCAoSU9wZXJhdGlvbkxpc3RlbmVyKSBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVzdGFydGluZyBzZXJ2ZXIiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoc2VsKTsKLQkJdXBkYXRlVGV4dChzZWwpOwkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydE1vZHVsZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0TW9kdWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGMyNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0TW9kdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBSZXN0YXJ0IGEgbW9kdWxlIG9uIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnRNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQotCXB1YmxpYyBTdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0TW9kdWxlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUKSk7Ci0JCXNldEVuYWJsZWQoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECi0JCQkJJiYgKHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRAotCQkJCQl8fCBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQkJJiYgc2VydmVyLmNhbkNvbnRyb2xNb2R1bGUobW9kdWxlLCBudWxsKS5pc09LKCkpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQlKb2Igc3RhcnRKb2IgPSBuZXcgSm9iKE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzMsIG1vZHVsZVtzaXplLTFdLmdldE5hbWUoKSkpIHsKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlzZXJ2ZXIuc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJc3RhcnRKb2Iuc2NoZWR1bGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNDk1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogU3RvcCAodGVybWluYXRlKSBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0b3BBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHVibGljIFN0b3BBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblN0b3ApOwotCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wVG9vbFRpcCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUT1ApKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RPUCkpOwotCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc3RvcCIpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmNhblN0b3AoKS5pc09LKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3RvcChzZXJ2ZXIsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcChJU2VydmVyIHNlcnZlciwgU2hlbGwgc2hlbGwpIHsKLQkJU2VydmVyVUlQbHVnaW4uYWRkVGVybWluYXRpb25XYXRjaChzaGVsbCwgc2VydmVyLCBTZXJ2ZXJVSVBsdWdpbi5TVE9QKTsgLy8gVE9ETyAtIHNob3VsZCByZWRvCi0JCQotCQlJSm9iTWFuYWdlciBqb2JNYW5hZ2VyID0gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQkJSm9iW10gam9icyA9IGpvYk1hbmFnZXIuZmluZChTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZKTsKLQkJZm9yIChKb2Igajogam9icykgewotCQkJaWYgKGogaW5zdGFuY2VvZiBTZXJ2ZXIuU3RhcnRKb2IpIHsKLQkJCQlTZXJ2ZXIuU3RhcnRKb2Igc3RhcnRKb2IgPSAoU2VydmVyLlN0YXJ0Sm9iKSBqOwotCQkJCWlmIChzdGFydEpvYi5nZXRTZXJ2ZXIoKS5lcXVhbHMoc2VydmVyKSkgewotCQkJCQlzdGFydEpvYi5jYW5jZWwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJc2VydmVyLnN0b3AoZmFsc2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcE1vZHVsZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BNb2R1bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjMGEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcE1vZHVsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogUmVzdGFydCBhIG1vZHVsZSBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0b3BNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQotCXB1YmxpYyBTdG9wTW9kdWxlQWN0aW9uKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJCi0JCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcE1vZHVsZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUT1ApKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RPUCkpOwotCQlzZXRFbmFibGVkKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRAotCQkJCSYmIChzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKLQkJCQkJfHwgc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJCSYmIHNlcnZlci5jYW5Db250cm9sTW9kdWxlKG1vZHVsZSwgbnVsbCkuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJSm9iIHN0b3BKb2IgPSBuZXcgSm9iKE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzMsIG1vZHVsZVtzaXplLTFdLmdldE5hbWUoKSkpIHsKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlzZXJ2ZXIuc3RvcE1vZHVsZShtb2R1bGUsIG51bGwpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlzdG9wSm9iLnNjaGVkdWxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRhYmxlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMzYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFibGVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQljcmVhdGVXaWRnZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZVRhYmxlKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJY3JlYXRlVGFibGVWaWV3ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKCkgewotCQl0YWJsZVZpZXdlciA9IG5ldyBMb2NrZWRUYWJsZVZpZXdlcih0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgewotCQl0YWJsZVZpZXdlci5yZW1vdmUob2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NGZhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkVHJlZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBGaWx0ZXJlZFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBBYnN0cmFjdFRyZWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCWNyZWF0ZVdpZGdldHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXaWRnZXRzKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDM7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCVN0cmluZyBkZXNjcmlwdGlvblRleHQgPSBnZXREZXNjcmlwdGlvbkxhYmVsKCk7Ci0JCWlmIChkZXNjcmlwdGlvblRleHQgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvblRleHQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCQotCQlTdHJpbmcgZGV0YWlscyA9IGdldERldGFpbHNMYWJlbCgpOwotCQlpZiAoZGV0YWlscyAhPSBudWxsKSB7Ci0JCQlMaW5rIHByZWZMaW5rID0gbmV3IExpbmsodGhpcywgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXByZWZMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlwcmVmTGluay5zZXRUZXh0KCI8YT4iICsgZGV0YWlscyArICI8L2E+Iik7Ci0JCQlwcmVmTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRldGFpbHNTZWxlY3RlZCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0VGl0bGVMYWJlbCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlpZiAoZGVzY3JpcHRpb25UZXh0ICE9IG51bGwgJiYgZGV0YWlscyA9PSBudWxsKQotCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDc7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY3JlYXRlVHJlZSgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0cmVlVmlld2VyID0gdHJlZS5nZXRWaWV3ZXIoKTsKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKHRyZWVWaWV3ZXIuaXNFeHBhbmRhYmxlKGVsZW1lbnQpKQotCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoZWxlbWVudCwgIXRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50KSk7Ci0JCSAgICB9Ci0JCX0pOwotCQkKLQkJaWYgKGhhc0Rlc2NyaXB0aW9uKCkpIHsKLQkJCWRlc2NyaXB0aW9uID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKLQkJCWRlc2NyaXB0aW9uLnNldFRleHQoIk11bHRpXG5MaW5lXG5NZXNzYWdlIik7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkJUG9pbnQgcCA9IGRlc2NyaXB0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJaWYgKHAueSA+IDEwKQotCQkJCWRhdGEuaGVpZ2h0SGludCA9IHAueTsKLQkJCWVsc2UKLQkJCQlkYXRhLmhlaWdodEhpbnQgPSA0MjsKLQkJCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQkJCi0JCXRyZWUuZm9yY2VGb2N1cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRyZWUoKSB7Ci0JCXRyZWUgPSBuZXcgRmlsdGVyZWRUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFLCBuZXcgU2VydmVyUGF0dGVybkZpbHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIHRleHQgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uLnNldFRleHQodGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBvYmopIHsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBvYmopIHsKLQkJdHJlZVZpZXdlci5yZW1vdmUob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERldGFpbHNMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc1NlbGVjdGVkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgzM2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb247Ci0KLQlwdWJsaWMgY2xhc3MgVHJlZUVsZW1lbnQgewotCQlwdWJsaWMgU3RyaW5nIHRleHQ7Ci0JCXB1YmxpYyBMaXN0PE9iamVjdD4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGVsZW1lbnRzOwotCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBUcmVlRWxlbWVudD4gZWxlbWVudFRvUGFyZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBUcmVlRWxlbWVudD4oMik7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFRyZWVFbGVtZW50PiB0ZXh0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlRWxlbWVudD4oMik7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQkKLQkJZmlsbFRyZWUoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKGJvb2xlYW4gaW5pdCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxUcmVlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbigpIHsKLQkJZWxlbWVudHMgPSBudWxsOwotCQllbGVtZW50VG9QYXJlbnRNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFRyZWVFbGVtZW50PigyKTsKLQkJdGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJlZUVsZW1lbnQ+KDIpOwotCQkKLQkJaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QsIFN0cmluZyB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gdGV4dE1hcC5nZXQodGV4dCk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIChUcmVlRWxlbWVudCkgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVRyZWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgVHJlZUVsZW1lbnQoKTsKLQkJZWxlbWVudC50ZXh0ID0gdGV4dDsKLQkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0ZXh0TWFwLnB1dCh0ZXh0LCBlbGVtZW50KTsKLQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJlZUVsZW1lbnQgZ2V0T3JDcmVhdGUoTGlzdDxUcmVlRWxlbWVudD4gbGlzdCwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IHRleHRNYXAuZ2V0KGlkKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQlyZXR1cm4gKFRyZWVFbGVtZW50KSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudCgpOwotCQllbGVtZW50LnRleHQgPSB0ZXh0OwotCQllbGVtZW50LmNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCXRleHRNYXAucHV0KGlkLCBlbGVtZW50KTsKLQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRCeVRleHQoU3RyaW5nIHRleHQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0ZXh0TWFwLmdldCh0ZXh0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRQYXJlbnRJbXBsKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50VG9QYXJlbnRNYXAuZ2V0KG9iaik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gIAotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB2aWV3ZXIgd2hlbiBpdCBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIAotCSAqIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4gCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLgotCSAqIFRoZSByZXN1bHQgaXMgbm90IG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVRyZWVFbGVtZW50IHJ0ZSA9IChUcmVlRWxlbWVudCkgZWxlbWVudDsKLQkJcmV0dXJuIHJ0ZS5jb250ZW50cy50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFBhcmVudEltcGwoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKLQkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIKLQkgKiB0byBjaGFuZ2VzIG9uIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciAKLQkgKiBmcm9tIHRoZSBvbGQgaW5wdXQuIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlcgotCSAqIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHZpZXdlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyCi0JICogICBkaWQgbm90IHByZXZpb3VzbHkgaGF2ZSBhbiBpbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKLQkgKiAgIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0QWxsT2JqZWN0cygpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJT2JqZWN0W10gb2JqID0gZ2V0RWxlbWVudHMobnVsbCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoIShvYmpbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpKQotCQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJCWdldEFsbENoaWxkcmVuKGxpc3QsIG9ialtpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxDaGlsZHJlbihMaXN0PE9iamVjdD4gbGlzdCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gb2JqID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoIShvYmpbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpKQotCQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJCWdldEFsbENoaWxkcmVuKGxpc3QsIG9ialtpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCUluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBpc3AgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWluaXRpYWxTZWxlY3Rpb24gPSBpc3AuZ2V0SW5pdGlhbFNlbGVjdGlvbihnZXRBbGxPYmplY3RzKCkpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsU2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRiZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEFic3RyYWN0IHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEEgc3RhbmRhcmQgdHJlZSBsYWJlbCBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHN0YW5kYXJkIHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKGRlY29yYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgewotCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlSW1wbChlbGVtZW50KTsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlYzsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGltYWdlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAgCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudAotCSAqIEByZXR1cm4gYW4gaW1hZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEBzZWUgQmFzZUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgewotCQkJcmV0dXJuICgoU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgZWxlbWVudCkudGV4dDsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IGdldFRleHRJbXBsKGVsZW1lbnQpOwotCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOwotCQkJaWYgKGRlYyAhPSBudWxsICYmICFkZWMuZXF1YWxzKCIiKSkKLQkJCQlyZXR1cm4gZGVjOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAgCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudAotCSAqIEByZXR1cm4gYSBsYWJlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGV4dEltcGwoT2JqZWN0IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNlbGxMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDZWxsTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU1NjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNlbGxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ2VsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEEgYmFzaWMgY2VsbCBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VDZWxsTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyI3VwZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNlbGwpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKFZpZXdlckNlbGwgY2VsbCl7Ci0JCXN1cGVyLnVwZGF0ZShjZWxsKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBjZWxsLmdldEVsZW1lbnQoKTsKLQkJaW50IGluZGV4ID0gY2VsbC5nZXRDb2x1bW5JbmRleCgpOwotCQljZWxsLnNldFRleHQoZ2V0Q29sdW1uVGV4dChlbGVtZW50LGluZGV4KSk7Ci0JCUltYWdlIGltYWdlID0gZ2V0Q29sdW1uSW1hZ2UoZWxlbWVudCwgaW5kZXgpOwotCQljZWxsLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBCYXNlQ2VsbExhYmVsUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQmFzZUNlbGxMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIEJhc2VDZWxsTGFiZWxQcm92aWRlciB3aXRoIGEgZGVjb3JhdG9yIGF0IHRoZSBmcm9udCBvZiB0aGUgcm93Ci0JICogQHBhcmFtIGRlY29yYXRvcgotCSAqLwotCXB1YmxpYyBCYXNlQ2VsbExhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlzdXBlcigpOwotCQlpZiAoZGVjb3JhdG9yID09IG51bGwpCi0JCQlkZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOwotCQkKLQkJdGhpcy5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7Ci0JfSAKLQotCXB1YmxpYyBQb2ludCBnZXRUb29sVGlwU2hpZnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmV3IFBvaW50KDUsIDUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG9vbFRpcERpc3BsYXlEZWxheVRpbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gMjAwMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvb2xUaXBUaW1lRGlzcGxheWVkKE9iamVjdCBvYmplY3QpIHsJCi0JCXJldHVybiA1MDAwOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZGVycyBvZiB0aGlzIGNsYXNzIHdvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFuIGltYWdlIHRvIHRoZSBjb2x1bW4gYmFzZWQgb24gdGhlIGVsZW1lbnQgCi0JICogYmVpbmcgcGFzc2VkCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuIGFuIGltYWdlCi0JICovCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpOwotCi0JLyoqCi0gICAgKiBFeHRlbmRlcnMgb2YgdGhpcyBjbGFzcyB3b3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIHRleHQgbGFiZWwgdG8gdGhlIGNvbHVtbiBiYXNlZCBvbiB0aGUgZWxlbWVudAotICAgICogYmVpbmcgcGFzc2VkIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiBhIHN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU1MmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQlwdWJsaWMgQmFzZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGNmNjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEEgYmFzaWMgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcjsKLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVyczsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgcHJvdmlkZXJMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgYmFzaWMgSUxhYmVsUHJvdmlkZXIgd2l0aCBubyBkZWNvcmF0b3IuCi0JICovCi0JcHVibGljIEJhc2VMYWJlbFByb3ZpZGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEEgYmFzaWMgSUxhYmVsUHJvdmlkZXIgd2l0aCBzdXBwb3J0IGZvciBhIGRlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChkZWNvcmF0b3IgPT0gbnVsbCkKLQkJCWRlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCQotCQl0aGlzLmRlY29yYXRvciA9IGRlY29yYXRvcjsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQlwcm92aWRlckxpc3RlbmVyID0gbmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlmaXJlTGlzdGVuZXIoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gYXZvaWQgaGF2aW5nIGEgbGFiZWwgZGVjb3JhdG9yLiBUaGlzIG1ldGhvZCBpcyBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBub0RlY29yYXRvcgotCSAqLwotCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcihib29sZWFuIG5vRGVjb3JhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+KCk7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQkKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUxpc3RlbmVyKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGxpc3RlbmVycy5zaXplKCk7Ci0JCUlMYWJlbFByb3ZpZGVyTGlzdGVuZXJbXSBzcmwgPSBuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcltzaXplXTsKLQkJbGlzdGVuZXJzLnRvQXJyYXkoc3JsKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXNybFtpXS5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICIgIEVycm9yIGZpcmluZyBsYWJlbCBjaGFuZ2UgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkKLQkJCWRlY29yYXRvci5yZW1vdmVMaXN0ZW5lcihwcm92aWRlckxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiBzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvRGVmYXVsdFZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZhdWx0Vmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjYxNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZhdWx0Vmlld2VyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIHNvcnQgY2F0ZWdvcmllcywgcnVudGltZSB0eXBlcywgYW5kIHNlcnZlciB0eXBlcyBpbiB0aGUKLSAqIE5ldyB3aXphcmRzLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JTID0gIi4sIjsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHNlZ21lbnRzOwotCi0JCXByaXZhdGUgVmVyc2lvbihTdHJpbmdbXSBzZWdtZW50cykgewotCQkJdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzOwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBWZXJzaW9uIHBhcnNlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbiwgU0VQQVJBVE9SUywgZmFsc2UpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlsaXN0LmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0JCQkKLQkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShzKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvbihzKTsKLQkJfQotCi0JCXByaXZhdGUgaW50IGNvbXBhcmVUbyhTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJdHJ5IHsKLQkJCQlpbnQgaTEgPSBJbnRlZ2VyLnBhcnNlSW50KHMxKTsKLQkJCQlpbnQgaTIgPSBJbnRlZ2VyLnBhcnNlSW50KHMyKTsKLQkJCQlpZiAoaTEgPT0gaTIpCi0JCQkJCXJldHVybiAwOwotCQkJCWlmIChpMSA+IGkyKQotCQkJCQlyZXR1cm4gMTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0ID09IHRoaXMpCi0JCQkJcmV0dXJuIDA7Ci0JCQkKLQkJCVZlcnNpb24gb3RoZXIgPSAoVmVyc2lvbikgb2JqZWN0OwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBzZWdtZW50cy5sZW5ndGggJiYgaSA8IG90aGVyLnNlZ21lbnRzLmxlbmd0aCkgewotCQkJCVN0cmluZyBzMSA9IHNlZ21lbnRzW2ldOwotCQkJCVN0cmluZyBzMiA9IG90aGVyLnNlZ21lbnRzW2ldOwotCQkJCWludCBjID0gY29tcGFyZVRvKHMxLCBzMik7Ci0JCQkJaWYgKGMgIT0gMCkKLQkJCQkJcmV0dXJuIGM7Ci0JCQkJaSsrOwotCQkJfQotCQkJCi0JCQlpZiAoaSA9PSBzZWdtZW50cy5sZW5ndGggJiYgaSA9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpCi0JCQkJcmV0dXJuIDA7Ci0JCQkKLQkJCWlmIChpID09IHNlZ21lbnRzLmxlbmd0aCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkKLQkJCW8xID0gKChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIG8xKS50ZXh0OwotCQkKLQkJaWYgKG8yIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KQotCQkJbzIgPSAoKEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgbzIpLnRleHQ7Ci0JCQotCQkvLyBmaWx0ZXIgb3V0IHN0cmluZ3MKLQkJaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nICYmIG8yIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIGNvbXBhcmVDYXRlZ29yaWVzKChTdHJpbmcpIG8xLCAoU3RyaW5nKSBvMik7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAtMTsKLQkJaWYgKG8yIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIDE7Ci0JCQotCQlpZiAobzEgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUgJiYgbzIgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpCi0JCQlyZXR1cm4gY29tcGFyZVJ1bnRpbWVUeXBlcygoSVJ1bnRpbWVUeXBlKSBvMSwgKElSdW50aW1lVHlwZSkgbzIpOwotCQkKLQkJaWYgKG8xIGluc3RhbmNlb2YgSVNlcnZlclR5cGUgJiYgbzIgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkKLQkJCXJldHVybiBjb21wYXJlU2VydmVyVHlwZXMoKElTZXJ2ZXJUeXBlKSBvMSwgKElTZXJ2ZXJUeXBlKSBvMik7Ci0JCQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHR3byBjYXRlZ29yeSBuYW1lcy4KLQkgKiAKLQkgKiBAcGFyYW0gczEgdGhlIGZpcnN0IGNhdGVnb3J5Ci0JICogQHBhcmFtIHMyIHRoZSBzZWNvbmQgY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotCSAqICAgIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLQkgKiAgICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLQkgKiAgICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjb21wYXJlQ2F0ZWdvcmllcyhTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQl0cnkgewotCQkJVmVyc2lvbiB2MSA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKHMxKTsKLQkJCVZlcnNpb24gdjIgPSBWZXJzaW9uLnBhcnNlVmVyc2lvbihzMik7Ci0JCQkKLQkJCXJldHVybiB2MS5jb21wYXJlVG8odjIpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHdvIGl0ZW1zIGFyZSBpbiB0aGUgc2FtZSAnZmFtaWx5JywgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gczEgLSBmaXJzdCBuYW1lCi0JICogQHBhcmFtIHYxIC0gZmlyc3QgdmVyc2lvbgotCSAqIEBwYXJhbSBzMiAtIHNlY29uZCBuYW1lCi0JICogQHBhcmFtIHYyIC0gc2Vjb25kIHZlcnNpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gaXRlbXMgYXJlIGluIHRoZSBzYW1lICdmYW1pbHknLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZUZhbWlseShTdHJpbmcgczEsIFN0cmluZyB2MSwgU3RyaW5nIHMyLCBTdHJpbmcgdjIpIHsKLQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICh2MSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kID0gczEuaW5kZXhPZih2MSk7Ci0JCQlpZiAoaW5kID49IDApCi0JCQkJczEgPSBzMS5zdWJzdHJpbmcoMCwgaW5kKSArIHMxLnN1YnN0cmluZyhpbmQrdjEubGVuZ3RoKCkpOwotCQl9Ci0JCQotCQlpZiAodjIgIT0gbnVsbCkgewotCQkJaW50IGluZCA9IHMyLmluZGV4T2YodjIpOwotCQkJaWYgKGluZCA+PSAwKQotCQkJCXMyID0gczIuc3Vic3RyaW5nKDAsIGluZCkgKyBzMi5zdWJzdHJpbmcoaW5kK3YyLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gKHMxLmVxdWFscyhzMikpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmVWZXJzaW9ucyhTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlWZXJzaW9uIHYxID0gVmVyc2lvbi5wYXJzZVZlcnNpb24oczEpOwotCQlWZXJzaW9uIHYyID0gVmVyc2lvbi5wYXJzZVZlcnNpb24oczIpOwotCQkKLQkJcmV0dXJuIHYxLmNvbXBhcmVUbyh2Mik7Ci0JfQotCi0JLyoqCi0JICogU29ydCB0d28gcnVudGltZSB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcjEgdGhlIGZpcnN0IHJ1bnRpbWUgdHlwZQotCSAqIEBwYXJhbSByMiB0aGUgc2Vjb25kIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0JICogICAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcwotCSAqICAgIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAotCSAqICAgIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmVSdW50aW1lVHlwZXMoSVJ1bnRpbWVUeXBlIHIxLCBJUnVudGltZVR5cGUgcjIpIHsKLQkJaWYgKGlzU2FtZUZhbWlseShyMS5nZXROYW1lKCksIHIxLmdldFZlcnNpb24oKSwgcjIuZ2V0TmFtZSgpLCByMi5nZXRWZXJzaW9uKCkpKQotCQkJcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhyMS5nZXRWZXJzaW9uKCksIHIyLmdldFZlcnNpb24oKSk7Ci0JCQotCQlyZXR1cm4gcjEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocjIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHR3byBzZXJ2ZXIgdHlwZXMuCi0JICogCi0JICogQHBhcmFtIHMxIHRoZSBmaXJzdCBzZXJ2ZXIgdHlwZQotCSAqIEBwYXJhbSBzMiB0aGUgc2Vjb25kIHNlcnZlciB0eXBlCi0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLQkgKiAgICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0JICogICAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0JICogICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY29tcGFyZVNlcnZlclR5cGVzKElTZXJ2ZXJUeXBlIHMxLCBJU2VydmVyVHlwZSBzMikgewotCQlJUnVudGltZVR5cGUgcjEgPSBzMS5nZXRSdW50aW1lVHlwZSgpOwotCQlJUnVudGltZVR5cGUgcjIgPSBzMi5nZXRSdW50aW1lVHlwZSgpOwotCQlpZiAocjEgIT0gbnVsbCAmJiByMiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTYW1lRmFtaWx5KHMxLmdldE5hbWUoKSwgcjEuZ2V0VmVyc2lvbigpLCBzMi5nZXROYW1lKCksIHIyLmdldFZlcnNpb24oKSkpCi0JCQkJcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhyMS5nZXRWZXJzaW9uKCksIHIyLmdldFZlcnNpb24oKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShzMi5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNjIyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5leHRlbnNpb24uRXh0ZW5zaW9uVXRpbGl0eTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Db21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZmVhdHVyZVNlbGVjdGVkKElGZWF0dXJlIGZlYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgRm9udCBmb250OwotCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4gaW1hZ2VzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ncmVzczsKLQlwcm90ZWN0ZWQgaW50IHRvdGFsV29yazsKLQlwcm90ZWN0ZWQgZG91YmxlIGN1cnJlbnRXb3JrOwotCXByb3RlY3RlZCBpbnQgY291bnQ7Ci0KLQlwdWJsaWMgRmVhdHVyZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEV4dGVuc2lvbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIEZlYXR1cmVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDU7Ci0JCS8vbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUZvbnQgY3VycmVudEZvbnQgPSBnZXRGb250KCk7Ci0JCUZvbnREYXRhW10gZmQgPSBjdXJyZW50Rm9udC5nZXRGb250RGF0YSgpOwotCQlpbnQgc2l6ZTIgPSBmZC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJZmRbaV0uc2V0SGVpZ2h0KGZkW2ldLmdldEhlaWdodCgpICsgMik7Ci0JCQlmZFtpXS5zZXRTdHlsZShTV1QuQk9MRCk7Ci0JCX0KLQkJCi0JCWZvbnQgPSBuZXcgRm9udChnZXREaXNwbGF5KCksIGZkKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMzUwOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCS8vZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vZGF0YS5oZWlnaHRIaW50ID0gMjUwOwotCQlkYXRhLndpZHRoSGludCA9IDM1MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy90YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlkaXNwb3NlUmVzb3VyY2VzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJCi0JCS8qdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDkwLCBmYWxzZSkpOwotCQkvL3RhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgODAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wyLnNldFRleHQoIm51bGwiKTsKLQkJKi8KLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMCwgMjUwLCBmYWxzZSkpOwotCQlmaW5hbCBUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoIm51bGwiKTsKLQkJLypjb2wuc2V0V2lkdGgoMzAwKTsKLQkJY29sLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJY29sLnBhY2soKTsKLQkJCX0KLQkJfSk7Ki8KLQkJCi0JCS8vdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgMjUwLCBmYWxzZSkpOwotCQkvL1RhYmxlQ29sdW1uIGNvbDIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJLy9jb2wyLnNldFRleHQoIm51bGwyIik7Ci0JCQotCQlmaW5hbCBpbnQgVEVYVF9NQVJHSU4gPSAzOwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZXZlbnQud2lkdGgpOwotCQkJCS8qVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCU9iamVjdCBvYmogPSBpdGVtLmdldERhdGEoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWVhc3VyZSAiICsgb2JqKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQlldmVudC5nYy5zZXRGb250KGZvbnQpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCgiQSIpOwotCQkJCQlldmVudC5nYy5zZXRGb250KG51bGwpOwotCQkJCQkvL2V2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgVEVYVF9NQVJHSU4gKiAyICsgc2l6ZS55KTsKLQkJCQkJZXZlbnQuaGVpZ2h0ID0gVEVYVF9NQVJHSU4gKiAyICsgc2l6ZS55OwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXZlbnQuaGVpZ2h0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0qLwotCQkJCWV2ZW50LmdjLnNldEZvbnQoZm9udCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQoIkEiKTsKLQkJCQlpbnQgaCA9IFRFWFRfTUFSR0lOICogMyArIHNpemUueTsKLQkJCQlzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCgiQSIpOwotCQkJCWV2ZW50LmdjLnNldEZvbnQobnVsbCk7Ci0JCQkJaCArPSBzaXplLnk7Ci0JCQkJaCA9IE1hdGgubWF4KGgsIDQwICsgVEVYVF9NQVJHSU4gKiAyKTsKLQkJCQkvL2V2ZW50LndpZHRoID0gNDAwOwotCQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgaCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZXZlbnQuaGVpZ2h0KTsKLQkJCQkvL2V2ZW50LndpZHRoID0gMzAwOwotCQkJfQotCQl9KTsKLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkvL2lmIChldmVudC5pbmRleCA9PSAwKQotCQkJCS8vCXJldHVybjsKLQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5GT1JFR1JPVU5EOwotCQkJCS8vZXZlbnQuZGV0YWlsICY9IH5TV1QuQkFDS0dST1VORDsKLQkJCX0KLQkJfSk7Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9pZiAoZXZlbnQuaW5kZXggPT0gMCkKLQkJCQkvLwlyZXR1cm47Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCU9iamVjdCBvYmogPSBpdGVtLmdldERhdGEoKTsKLQkJCQkKLQkJCQlpbnQgd2lkdGggPSB0YWJsZS5nZXRDb2x1bW4oMCkuZ2V0V2lkdGgoKTsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBvYmo7Ci0JCQkJCWlmIChwcm9ncmVzcyAhPSBudWxsKQotCQkJCQkJcyA9IHByb2dyZXNzOwotCQkJCQlpbnQgaCA9IGV2ZW50LnkgKyBldmVudC5oZWlnaHQgLyAyOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudChzKTsKLQkJCQkJZ2MuZHJhd1RleHQocywgZXZlbnQueCArIFRFWFRfTUFSR0lOLCBoIC0gc2l6ZS55LzIsIHRydWUpOwotCQkJCQkKLQkJCQkJaW50IGhoID0gZXZlbnQueSArIGV2ZW50LmhlaWdodCAtIDUgLSBURVhUX01BUkdJTiAtIDE7Ci0JCQkJCQotCQkJCQlnYy5zZXRMaW5lV2lkdGgoMik7Ci0JCQkJCUNvbG9yIGNvbG9yID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQkKLQkJCQkJaW50IHdpZHRoMiA9IDA7Ci0JCQkJCWludCBzdGVwID0gOTsKLQkJCQkJaWYgKHRvdGFsV29yayA+IDApCi0JCQkJCQl3aWR0aDIgPSAoaW50KSAoKHdpZHRoIC0gc3RlcCAqIDIgLSAxNSAtIFRFWFRfTUFSR0lOICogMikgKiBjdXJyZW50V29yayAvIHRvdGFsV29yayk7Ci0JCQkJCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoMjsgaSs9IHN0ZXApIHsKLQkJCQkJCWdjLmZpbGxSZWN0YW5nbGUoZXZlbnQueCArIFRFWFRfTUFSR0lOICsgaSwgaGgsIHN0ZXAgLSAyLCA1KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlMaXN0PFN0cmluZz4gbGlzdCA9IChMaXN0PFN0cmluZz4pIG9iajsKLQkJCQkJCi0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJCVN0cmluZ1tdIGhvc3RzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJCQkJbGlzdC50b0FycmF5KGhvc3RzKTsKLQkJCQkJCi0JCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChpID4gMCkKLQkJCQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQkJCQlzYi5hcHBlbmQoaG9zdHNbaV0pOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBzID0gTkxTLmJpbmQoTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJTaXRlRXJyb3IsIHNiLnRvU3RyaW5nKCkpOwotCQkJCQlnYy5kcmF3VGV4dChzLCBldmVudC54ICsgVEVYVF9NQVJHSU4sIGV2ZW50LnkgKyBURVhUX01BUkdJTiwgdHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJSUZlYXR1cmUgZWkgPSAoSUZlYXR1cmUpIG9iajsKLQkJCQlpZiAoZWkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCQotCQkJCS8vaWYgKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpID09IDApIHsKLQkJCQkvLwkvL2V2ZW50LmdjLnNldEZvcmVncm91bmQoKTsKLQkJCQkvLwkvL2V2ZW50LmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIDUpOwotCQkJCS8vCWV2ZW50LmdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCQkvLwlldmVudC5nYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JCQkJLy8JZXZlbnQuZ2MuZmlsbFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQkvL30KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih3aWR0aCArICIgIiArIGV2ZW50LndpZHRoICsgIiAiICsgZXZlbnQueCk7Ci0JCQkJCi0JCQkJU3RyaW5nIG5hbWUgPSBlaS5nZXRMYWJlbCgpOwotCQkJCVN0cmluZyBwcm92aWRlciA9ICIiICsgZWkuZ2V0UHJvdmlkZXIoKTsKLQkJCQkvL1N0cmluZyBwcm92aWRlciA9ICIiICsgZWkuZ2V0SW1hZ2UoKTsKLQkJCQkvL1N0cmluZyBwcm92aWRlciA9ICIiICsgRXh0ZW5zaW9uVXRpbGl0eS5nZXREZXNjcmlwdGlvbihlaSk7Ci0JCQkJU3RyaW5nIHZlciA9IGVpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJCWludCBpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOwotCQkJCWlmIChpbmQgPj0gMCkKLQkJCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQkJU3RyaW5nIHZlcnNpb24gPSAidiIgKyB2ZXI7Ci0JCQkJCi0JCQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShlaS5nZXRJbWFnZSgpKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfU0VSVkVSKTsKLQkJCQlpbnQgaXcgPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQlpbnQgaWggPSBpbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBpdywgaWgsIGV2ZW50LnggKyBURVhUX01BUkdJTiwgZXZlbnQueSArIFRFWFRfTUFSR0lOLCA0MCwgNDApOwotCQkJCWl3ID0gNDAgKyBURVhUX01BUkdJTiAqIDI7Ci0JCQkJCi0JCQkJaW50IHlPZmZzZXQgPSBURVhUX01BUkdJTjsKLQkJCQlnYy5zZXRGb250KGZvbnQpOwotCQkJCWdjLmRyYXdUZXh0KG5hbWUsIGV2ZW50LnggKyBpdywgZXZlbnQueSArIHlPZmZzZXQsIHRydWUpOwotCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KG5hbWUpOwotCQkJCWdjLnNldEZvbnQobnVsbCk7Ci0JCQkJCi0JCQkJeU9mZnNldCArPSBzaXplLnkgKyBURVhUX01BUkdJTjsKLQkJCQlnYy5kcmF3VGV4dChwcm92aWRlciwgZXZlbnQueCArIGl3LCBldmVudC55ICsgeU9mZnNldCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodmVyc2lvbik7Ci0JCQkJZ2MuZHJhd1RleHQodmVyc2lvbiwgZXZlbnQueCArIHdpZHRoIC0gVEVYVF9NQVJHSU4gKiAzIC0gc2l6ZS54LCBldmVudC55ICsgeU9mZnNldCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlpZiAoKGUxIGluc3RhbmNlb2YgSUZlYXR1cmUpICYmICEoZTIgaW5zdGFuY2VvZiBJRmVhdHVyZSkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpZiAoIShlMSBpbnN0YW5jZW9mIElGZWF0dXJlKSAmJiAoZTIgaW5zdGFuY2VvZiBJRmVhdHVyZSkpCi0JCQkJCXJldHVybiAxOwotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGYxID0gKElGZWF0dXJlKSBlMTsKLQkJCQkJSUZlYXR1cmUgZjIgPSAoSUZlYXR1cmUpIGUyOwotCQkJCQlyZXR1cm4gKGYxLmdldExhYmVsKCkuY29tcGFyZVRvSWdub3JlQ2FzZShmMi5nZXRMYWJlbCgpKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCS8qQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlCdXR0b24gaW5zdGFsbCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsICJGaW5kIFVwZGF0ZXMiKTsKLQkJaW5zdGFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLwotCQkJfQotCQl9KTsqLwotCQkKLQkJZmluYWwgTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KCJNdWx0aVxuTGluZVxuTWVzc2FnZSIpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQlQb2ludCBwID0gZGVzY3JpcHRpb24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiIik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWlmIChwLnkgPiAxMCkKLQkJCWRhdGEuaGVpZ2h0SGludCA9IHAueTsKLQkJZWxzZQotCQkJZGF0YS5oZWlnaHRIaW50ID0gNDI7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvKmZpbmFsIExhYmVsIGRvd25sb2FkID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZG93bmxvYWQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZG93bmxvYWQuc2V0VGV4dCgiRG93bmxvYWQgc2l6ZTogIik7Ki8KLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmUpCi0JCQkJCWZlYXR1cmUgPSAoSUZlYXR1cmUpIG9iajsKLQkJCQkKLQkJCQloYW5kbGVTZWxlY3Rpb24oZmVhdHVyZSk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRpb24uc2V0VGV4dChFeHRlbnNpb25VdGlsaXR5LmdldERlc2NyaXB0aW9uKGZlYXR1cmUpKTsKLQkJCQllbHNlCi0JCQkJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOwotCQkJCS8qbG9uZyBzaXplID0gZmVhdHVyZS5nZXREb3dubG9hZFNpemUoKTsKLQkJCQlTdHJpbmcgcyA9ICI8dW5rbm93bj4iOwotCQkJCWlmIChzaXplID4gMCkKLQkJCQkJcyA9IHNpemUgKyAiIEtiIjsKLQkJCQlkb3dubG9hZC5zZXRUZXh0KCJEb3dubG9hZCBzaXplOiAiICsgcyk7Ki8KLQkJCX0KLQkJfSk7Ci0JCQotCQlkZWZlckluaXRpYWxpemF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFVSTCB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZXMuZ2V0KHVybC50b1N0cmluZygpKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJSW1hZ2UgaW1hZ2UgPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJaWYgKGltYWdlcyA9PSBudWxsKQotCQkJCWltYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2U+KCk7Ci0JCQlpbWFnZXMucHV0KHVybC50b1N0cmluZygpLCBpbWFnZSk7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ291bGQgbm90IGNyZWF0ZSBpbWFnZSIsIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VSZXNvdXJjZXMoKSB7Ci0JCXRyeSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJCQotCQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGRpc3Bvc2UgLSBwb3NzaWJsZSByZXNvdXJjZSBsZWFrIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oSUZlYXR1cmUgZmVhdHVyZSkgewotCQlsaXN0ZW5lci5mZWF0dXJlU2VsZWN0ZWQoZmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJZmluYWwgTGlzdDxPYmplY3Q+IGxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpKTsKLQkJbGlzdC5hZGQoTWVzc2FnZXMudmlld0luaXRpYWxpemluZyk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4dGVuc2lvbkNvbnRlbnRQcm92aWRlcihsaXN0KSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEV4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkKLQkJZmluYWwgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJEZWZlcnJlZCBJbml0aWFsaXphdGlvbiIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkZWZlcnJlZEluaXRpYWxpemUobGlzdCwgbmV3IElQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yazIpIHsKLQkJCQkJCXRvdGFsV29yayA9IHRvdGFsV29yazI7Ci0JCQkJCQlwcm9ncmVzcyA9IG5hbWU7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJCQkJcHJvZ3Jlc3MgPSBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJCQkJcHJvZ3Jlc3MgPSBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJCQkJCS8vIAotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLQkJCQkJCWN1cnJlbnRXb3JrICs9IHdvcms7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQkJCQkJLy8gCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLQkJCQkJCWN1cnJlbnRXb3JrICs9IHdvcms7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJZmluYWwgaW50IFNMRUVQID0gMTAwOwotCQlmaW5hbCBSdW5uYWJsZVtdIGFuaW1hdG9yID0gbmV3IFJ1bm5hYmxlWzFdOwotCQlhbmltYXRvclswXSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodC5pc0FsaXZlKCkpIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQkJCQkJZGlzcGxheS50aW1lckV4ZWMoU0xFRVAsIGFuaW1hdG9yWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWRpc3BsYXkudGltZXJFeGVjKFNMRUVQLCBhbmltYXRvclswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVmZXJyZWRJbml0aWFsaXplKGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IGZhaWxlZFNpdGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUV4dGVuc2lvblV0aWxpdHkuRmVhdHVyZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBFeHRlbnNpb25VdGlsaXR5LkZlYXR1cmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZlYXR1cmVGb3VuZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQkJbGlzdC5hZGQoZmVhdHVyZSk7Ci0JCQkJaWYgKHByb2dyZXNzICE9IG51bGwpCi0JCQkJCWxpc3Quc2V0KDAsIHByb2dyZXNzKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJCWxpc3QucmVtb3ZlKGZlYXR1cmUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzaXRlRmFpbHVyZShTdHJpbmcgaG9zdCkgewotCQkJCXN5bmNocm9uaXplZCAoZmFpbGVkU2l0ZXMpIHsKLQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKGZhaWxlZFNpdGVzKSkKLQkJCQkJCWxpc3QuYWRkKGZhaWxlZFNpdGVzKTsKLQkJCQkJZmFpbGVkU2l0ZXMuYWRkKGhvc3QpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyQWRhcHRlciI7Ci0JCXRyeSB7Ci0JCQlFeHRlbnNpb25VdGlsaXR5LmdldEFsbEZlYXR1cmVzKGlkLCBsaXN0ZW5lcjIsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgZG93bmxvYWRpbmcgc2VydmVyIGFkYXB0ZXIgaW5mbyIsIGNlKTsKLQkJfQotCQkKLQkJbGlzdC5yZW1vdmUoMCk7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0Y2ZlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0vKioKLSAqIEV4dGVuc2lvbiBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uQ29udGVudFByb3ZpZGVyKExpc3QgbGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaW9uVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2UxZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLyoqCi0gKiBFeHRlbnNpb24gaXRlbSB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogRXh0ZW5zaW9uVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEV4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlzdXBlcihkZWNvcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0JCQlyZXR1cm4gIlNvbWUgdXBkYXRlIHNpdGVzIGZhaWxlZCI7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAoKFN0cmluZykgZWxlbWVudCkgKyBNYXRoLnJhbmRvbSgpOwotCQkKLQkJSUZlYXR1cmUgaXRlbSA9IChJRmVhdHVyZSkgZWxlbWVudDsKLQkJcmV0dXJuIGl0ZW0uZ2V0TGFiZWwoKSArICJcbiIgKyBpdGVtLmdldFByb3ZpZGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3MWUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0lMb2NrZWRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JVGFibGVMYWJlbFByb3ZpZGVyPC9jb2RlPiB3aXRoIG1ldGhvZHMgdG8gcHJvdmlkZQotICogbG9jayBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9ja2VkTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jayBpbmZvIGZvciB0aGUgZWxlbWVudC4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKLQkgKiB0byBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgdGFibGUgcm93LgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubyBpbnB1dCBvYmplY3QgaXMgc2V0Ci0JICogICAgaW4gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbG9ja2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoT2JqZWN0IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjkxN2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogQ2xhc3MgdXNlZCB0byBzb3J0IGNhdGVnb3JpZXMsIHJ1bnRpbWUgdHlwZXMsIGFuZCBzZXJ2ZXIgdHlwZXMgaW4gdGhlCi0gKiBOZXcgd2l6YXJkcy4KLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oT2JqZWN0W10gb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBvYmoubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXJ0W2ldID0gKElSdW50aW1lVHlwZSkgb2JqW2ldOwotCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24ocnQpOwotCQl9Ci0JCQotCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCUlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgSVNlcnZlclR5cGVbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlzdFtpXSA9IChJU2VydmVyVHlwZSkgb2JqW2ldOwotCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24oc3QpOwotCQl9Ci0JCQotCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJSVNlcnZlcltdIHN0ID0gbmV3IElTZXJ2ZXJbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlzdFtpXSA9IChJU2VydmVyKSBvYmpbaV07Ci0JCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlcwotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldEluaXRpYWxTZWxlY3Rpb24oSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcykgewotCQlpZiAoc2VydmVyVHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaGFzUnVudGltZShzZXJ2ZXJUeXBlc1tpXSkpCi0JCQkJcmV0dXJuIHNlcnZlclR5cGVzW2ldOwotCQl9Ci0JCXJldHVybiBnZXREZWZhdWx0U2VydmVyVHlwZShzZXJ2ZXJUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNlcnZlcnMKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldEluaXRpYWxTZWxlY3Rpb24oSVNlcnZlcltdIHNlcnZlcnMpIHsKLQkJaWYgKHNlcnZlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIHNlcnZlcnNbMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlcwotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElSdW50aW1lVHlwZSBnZXRJbml0aWFsU2VsZWN0aW9uKElSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcykgewotCQlpZiAocnVudGltZVR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChoYXNSdW50aW1lKHJ1bnRpbWVUeXBlc1tpXSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVUeXBlc1tpXTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXJldHVybiBoYXNSdW50aW1lKHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCXJldHVybiBydW50aW1lcyAhPSBudWxsICYmIHJ1bnRpbWVzLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgc2VydmVyIHR5cGUsIHR5cGljYWxseSB0aGUgJ2ZpcnN0JyBvbmUgc29ydGVkCi0JICogYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZXMKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNlcnZlciB0eXBlCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIGdldERlZmF1bHRTZXJ2ZXJUeXBlKElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwotCQlpZiAoc2l6ZSA9PSAxKQotCQkJcmV0dXJuIHNlcnZlclR5cGVzWzBdOwotCQkKLQkJSVNlcnZlclR5cGUgZmlyc3QgPSBzZXJ2ZXJUeXBlc1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChEZWZhdWx0Vmlld2VyU29ydGVyLmNvbXBhcmVTZXJ2ZXJUeXBlcyhmaXJzdCwgc2VydmVyVHlwZXNbaV0pID4gMCkKLQkJCQlmaXJzdCA9IHNlcnZlclR5cGVzW2ldOwotCQl9Ci0JCXJldHVybiBmaXJzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVmYXVsdCBydW50aW1lIHR5cGUsIHR5cGljYWxseSB0aGUgJ2ZpcnN0JyBvbmUgc29ydGVkCi0JICogYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVzCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBydW50aW1lIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVUeXBlIGdldERlZmF1bHRSdW50aW1lVHlwZShJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7Ci0JCWlmIChzaXplID09IDEpCi0JCQlyZXR1cm4gcnVudGltZVR5cGVzWzBdOwotCQkKLQkJSVJ1bnRpbWVUeXBlIGZpcnN0ID0gcnVudGltZVR5cGVzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKERlZmF1bHRWaWV3ZXJTb3J0ZXIuY29tcGFyZVJ1bnRpbWVUeXBlcyhmaXJzdCwgcnVudGltZVR5cGVzW2ldKSA+IDApCi0JCQkJZmlyc3QgPSBydW50aW1lVHlwZXNbaV07Ci0JCX0KLQkJcmV0dXJuIGZpcnN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTA2YjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIgZXh0ZW5kcyBDaGVja2JveFRhYmxlVmlld2VyIHsKLQlwcm90ZWN0ZWQgQ29sb3IgY29sb3I7Ci0KLQlwdWJsaWMgTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkgewotCQlzdXBlcih0YWJsZSk7Ci0JCWNyZWF0ZUNvbG9yKHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb2xvcihDb250cm9sIGMpIHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoYy5nZXREaXNwbGF5KCksIDI1NSwgMjU1LCAyMjUpOwotCQljLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvVXBkYXRlSXRlbShXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBmdWxsTWFwKSB7Ci0JCWlmIChjb2xvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIHdpZGdldDsKLQkJCWlmIChnZXRMYWJlbFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTG9ja2VkTGFiZWxQcm92aWRlcikgewotCQkJCUlMb2NrZWRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKElMb2NrZWRMYWJlbFByb3ZpZGVyKSBnZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJaWYgKHByb3ZpZGVyLmlzTG9ja2VkKGVsZW1lbnQpKSB7Ci0JCQkJCWl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JCQkJfSBlbHNlCi0JCQkJCWl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kb1VwZGF0ZUl0ZW0od2lkZ2V0LCBlbGVtZW50LCBmdWxsTWFwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMyZDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2tlZFRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKLQotCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWNyZWF0ZUNvbG9yKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCWNyZWF0ZUNvbG9yKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIExvY2tlZFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyKHRhYmxlKTsKLQkJY3JlYXRlQ29sb3IodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgewotCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDIyNSk7Ci0JCWMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJaWYgKGNvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgd2lkZ2V0OwotCQkJaWYgKGdldExhYmVsUHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMb2NrZWRMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxvY2tlZExhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2tlZExhYmVsUHJvdmlkZXIpIGdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlpZiAocHJvdmlkZXIuaXNMb2NrZWQoZWxlbWVudCkpIHsKLQkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJaXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQkJCQl9IGVsc2UKLQkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vZHVsZUFydGlmYWN0Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vZHVsZUFydGlmYWN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBhY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb2R1bGVBcnRpZmFjdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE1vZHVsZUFydGlmYWN0Q29tcG9zaXRlIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZUFydGlmYWN0W10gbW9kdWxlQXJ0aWZhY3RzOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CQotCXByaXZhdGUgU3RyaW5nIGxhdW5jaE1vZGU7CQkKLQlwcml2YXRlIElNb2R1bGVBcnRpZmFjdCBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBJTW9kdWxlQXJ0aWZhY3QgZm9yIHRoZSBzZWxlY3RlZCByZXNvdXJjZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3RzCi0JICogQHBhcmFtIGxhdW5jaE1vZGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUoU2hlbGwgcGFyZW50LGZpbmFsIElNb2R1bGVBcnRpZmFjdFtdIG1vZHVsZUFydGlmYWN0cywgU3RyaW5nIGxhdW5jaE1vZGUpewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1vZHVsZUFydGlmYWN0cyA9IG1vZHVsZUFydGlmYWN0czsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRXaW5kb3dUaXRsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCYXNlZCBvbiB0aGUgbGF1bmNoIG1vZGUsIHJldHVybiB0aGUgTkxTIFN0cmluZyBmb3IgdGhlIERpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3cgdGl0bGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXaW5kb3dUaXRsZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZTsKLQkJCi0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCXRpdGxlID0gTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlOwkJCQkJCi0JCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQl0aXRsZSA9IE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlOwotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCi0JCVRleHQgZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZUFydGlmYWN0c0Rlc2NyaXB0aW9uKTsKLQkJZGVzY3JpcHRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCQlkZXNjcmlwdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlkZXNjcmlwdGlvbi5zZXRDdXJzb3IoY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoU1dULkNVUlNPUl9BUlJPVykpOwotCQkKLQkJY3JlYXRlVGFibGUoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRhYmxlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsJCQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCi0JCXRhYmxlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkKLQkJTGFiZWwgdGFibGVUaXRsZSA9IG5ldyBMYWJlbCh0YWJsZUNvbXBvc2l0ZSxTV1QuTm9uZSk7Ci0JCXRhYmxlVGl0bGUuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVBcnRpZmFjdHNBdmFpbGFibGVMaXN0KTsKLQkJCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQl0YWJsZS5zZXRGb2N1cygpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSkpOwotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsJCQotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBCYXNlTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewkJCQkKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUpIHsKLQkJCQkJTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCA9IChNb2R1bGVBcnRpZmFjdERlbGVnYXRlKWVsZW1lbnQ7Ci0JCQkJCWlmIChtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkgPT0gbnVsbCB8fCBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmV0dXJuIG1vZHVsZUFydGlmYWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBCYXNlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsJCQkJCi0JCQkJcmV0dXJuIG1vZHVsZUFydGlmYWN0czsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGRpYWxvZwotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIG1vZHVsZSBhcnRpZmFjdAotCSAqLwotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0U2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24yID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbjIgPT0gbnVsbCB8fCBzZWxlY3Rpb24yLmdldEZpcnN0RWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gc2VsZWN0aW9uOwotCQkKLQkJc2VsZWN0aW9uID0gKElNb2R1bGVBcnRpZmFjdClzZWxlY3Rpb24yLmdldEZpcnN0RWxlbWVudCgpOyAKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNidXR0b25QcmVzc2VkKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJaWYgKGdldFNlbGVjdGlvbigpID09IG51bGwpewotCQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksU1dULklDT05fRVJST1IgfCBTV1QuT0spOwotCQkJCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShNZXNzYWdlcy53aXpNb2R1bGVBcnRpZmFjdHNOb1NlbGVjdGlvbkVycm9yKTsKLQkJCQltZXNzYWdlQm94LnNldFRleHQoZ2V0V2luZG93VGl0bGUoKSk7Ci0JCQkJbWVzc2FnZUJveC5vcGVuKCk7Ci0JCQkJLy8gYnlwYXNzIHRoZSBjYWxsIHRvIHN1cGVyLCBzbyB0aGF0IHRoaXMgRGlhbG9nIGRvZXNuJ3QgZ2V0IGRpc3Bvc2VkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA2NGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JLy9wcm90ZWN0ZWQgU2VydmVyUG9ydCBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIFBvcnRTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJNb25pdG9yTWFuYWdlciBzbW07Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIG1vbml0b3JUYWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgbW9uaXRvclRhYmxlVmlld2VyOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcG9ydFNlbGVjdGVkKFNlcnZlclBvcnQgcG9ydCk7Ci0JfQotCQotCXB1YmxpYyBNb25pdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQkKLQkJc21tID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW1vbml0b3JUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJLy9kYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMzQwOwotCQltb25pdG9yVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbW9uaXRvclRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJbW9uaXRvclRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG1vbml0b3JUYWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQltb25pdG9yVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJbW9uaXRvclRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtblN0YXR1cyk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyLCAxMjAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uVHlwZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtblBvcnQpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydCk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtbkNvbnRlbnRUeXBlKTsKLQkJCi0JCW1vbml0b3JUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoc2VydmVyKSk7Ci0JCW1vbml0b3JUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBNb25pdG9yTGFiZWxQcm92aWRlcihzZXJ2ZXIpKTsKLQkJbW9uaXRvclRhYmxlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQkJCi0JCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQxID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBlMTsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0MiA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZTI7Ci0JCQkJaWYgKHBvcnQxLmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgPT0gcG9ydDIuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSkgewotCQkJCQlpZiAocG9ydDEuZ2V0TW9uaXRvclBvcnQoKSA9PSBwb3J0Mi5nZXRNb25pdG9yUG9ydCgpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfSBlbHNlIGlmIChwb3J0MS5nZXRNb25pdG9yUG9ydCgpID4gcG9ydDIuZ2V0TW9uaXRvclBvcnQoKSkKLQkJCQkJCXJldHVybiAxOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIGlmIChwb3J0MS5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpID4gcG9ydDIuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlmaW5hbCBJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXI7Ci0JCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpLCBzZXJ2ZXIyKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCVNlcnZlclBvcnQgcG9ydCA9IGRpYWxvZy5nZXRTZXJ2ZXJQb3J0KCk7Ci0JCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHNwID0gc21tLmNyZWF0ZU1vbml0b3Ioc2VydmVyMiwgcG9ydCwgZGlhbG9nLmdldE1vbml0b3JQb3J0KCksIGRpYWxvZy5nZXRDb250ZW50VHlwZXMoKSk7Ci0JCQkJCWlmIChzcCAhPSBudWxsKQotCQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLmFkZChzcCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCWFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiBlZGl0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdCk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCU1vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IE1vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSwgc2VydmVyMiwgcG9ydC5nZXRTZXJ2ZXJQb3J0KCksIHBvcnQuZ2V0TW9uaXRvclBvcnQoKSwgcG9ydC5nZXRDb250ZW50VHlwZXMoKSk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQlzbW0ucmVtb3ZlTW9uaXRvcihwb3J0KTsKLQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlbW92ZShwb3J0KTsKLQkJCQkJcG9ydCA9IHNtbS5jcmVhdGVNb25pdG9yKHNlcnZlcjIsIGRpYWxvZy5nZXRTZXJ2ZXJQb3J0KCksIGRpYWxvZy5nZXRNb25pdG9yUG9ydCgpLCBkaWFsb2cuZ2V0Q29udGVudFR5cGVzKCkpOwotCQkJCQlpZiAocG9ydCAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yVGFibGVWaWV3ZXIuYWRkKHBvcnQpOwotCQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwb3J0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJZmluYWwgQnV0dG9uIHJlbW92ZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnJlbW92ZSk7Ci0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3AgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGdldFNlbGVjdGlvbihtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChtc3AuaXNTdGFydGVkKCkpCi0JCQkJCXNtbS5zdG9wTW9uaXRvcihtc3ApOwotCQkJCXNtbS5yZW1vdmVNb25pdG9yKG1zcCk7Ci0JCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlbW92ZShtc3ApOwotCQkJfQotCQl9KTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJZmluYWwgQnV0dG9uIHN0YXJ0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuc3RhcnQpOwotCQlzdGFydC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3AgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQlzbW0uc3RhcnRNb25pdG9yKG1zcCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlZnJlc2gobXNwKTsKLQkJCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1zcCkpOwotCQkJfQotCQl9KTsKLQkJc3RhcnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlmaW5hbCBCdXR0b24gc3RvcCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0b3ApOwotCQlzdG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgbW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXNtbS5zdG9wTW9uaXRvcihtc3ApOwotCQkJCW1vbml0b3JUYWJsZVZpZXdlci5yZWZyZXNoKG1zcCk7Ci0JCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtc3ApKTsKLQkJCX0KLQkJfSk7Ci0JCXN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQltb25pdG9yVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0ID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24obW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAocG9ydCAhPSBudWxsKSB7Ci0JCQkJCWVkaXQuc2V0RW5hYmxlZCghcG9ydC5pc1N0YXJ0ZWQoKSk7Ci0JCQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlzdGFydC5zZXRFbmFibGVkKCFwb3J0LmlzU3RhcnRlZCgpKTsKLQkJCQkJc3RvcC5zZXRFbmFibGVkKHBvcnQuaXNTdGFydGVkKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3RhcnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0W10gbXNwcyA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9uaXRvcmVkUG9ydHMoc2VydmVyKTsgCi0JCWlmIChtc3BzICE9IG51bGwgJiYgbXNwcy5sZW5ndGggPiAwKQotCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtc3BzWzBdKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTMxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLS8qKgotICogTW9uaXRvciBwb3J0IGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHVibGljIE1vbml0b3JDb250ZW50UHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9uaXRvcmVkUG9ydHMoc2VydmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZWU4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBEaWFsb2cgdGhhdCBwcm9tcHRzIGEgdXNlciB0byBhZGQgb3IgZWRpdCBhIHNlcnZlciBtb25pdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJQb3J0IHBvcnQ7Ci0JcHJvdGVjdGVkIGludCBtb25pdG9yUG9ydCA9IC0xOwotCXByb3RlY3RlZCBTdHJpbmdbXSBwb3J0Q29udGVudFR5cGVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb250ZW50VHlwZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcG9ydENoYW5nZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rOwotCQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdDsKLQotCS8qKgotCSAqIE1vbml0b3JEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0LCBTdHJpbmdbXSBjb250ZW50VHlwZXMpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgc2VydmVyKTsKLQkJdGhpcy5tb25pdG9yUG9ydCA9IG1vbml0b3JQb3J0OwotCQl0aGlzLmNvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlczsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJaXNFZGl0ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yVGl0bGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlvayA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JBZGREZXNjcmlwdGlvbiwgbmV3IFN0cmluZ1tdIHsgc2VydmVyLmdldE5hbWUoKSB9ICkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLndpZHRoSGludCA9IDI3NTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyLCAxMjAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5UeXBlKTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNCwgNDAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5Qb3J0KTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUG9ydENvbnRlbnRQcm92aWRlcihzZXJ2ZXIpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUG9ydExhYmVsUHJvdmlkZXIoc2VydmVyKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJU2VydmVyUG9ydCBwb3J0MSA9IChTZXJ2ZXJQb3J0KSBlMTsKLQkJCQlTZXJ2ZXJQb3J0IHBvcnQyID0gKFNlcnZlclBvcnQpIGUyOwotCQkJCWlmIChwb3J0MS5nZXRQb3J0KCkgPT0gcG9ydDIuZ2V0UG9ydCgpKQotCQkJCQlyZXR1cm4gMDsKLQkJCQllbHNlIGlmIChwb3J0MS5nZXRQb3J0KCkgPiBwb3J0Mi5nZXRQb3J0KCkpCi0JCQkJCXJldHVybiAxOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JNb25pdG9yUG9ydCk7Ci0JCQotCQlmaW5hbCBUZXh0IHBvcnRUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJcG9ydFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKG1vbml0b3JQb3J0ID49IDApCi0JCQlwb3J0VGV4dC5zZXRUZXh0KG1vbml0b3JQb3J0ICsgIiIpOwotCi0JCXBvcnRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3JQb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0VGV4dC5nZXRUZXh0KCkpOwotCQkJCQlpZiAob2sgIT0gbnVsbCkKLQkJCQkJCW9rLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCW1vbml0b3JQb3J0ID0gLTE7Ci0JCQkJCWlmIChvayAhPSBudWxsKQotCQkJCQkJb2suc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCXBvcnRDaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGUpOwotCQkKLQkJZmluYWwgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNpemUgPSBjb21iby5nZXRJdGVtQ291bnQoKTsKLQkJCQlpbnQgc2VsID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsID09IHNpemUgLSAxKQotCQkJCQljb250ZW50VHlwZXMgPSBwb3J0Q29udGVudFR5cGVzOwotCQkJCWVsc2UKLQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgcG9ydENvbnRlbnRUeXBlc1tzZWxdIH07Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlwb3J0ID0gKFNlcnZlclBvcnQpIGdldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmICghcG9ydENoYW5nZWQpIHsKLQkJCQkJcG9ydFRleHQuc2V0VGV4dCgocG9ydC5nZXRQb3J0KCkgKyAxKSArICIiKTsKLQkJCQkJcG9ydENoYW5nZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJcG9ydENvbnRlbnRUeXBlcyA9IHBvcnQuZ2V0Q29udGVudFR5cGVzKCk7Ci0JCQkJU3RyaW5nW10gcyA9IG51bGw7Ci0JCQkJU3RyaW5nIGFsbCA9IE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb250ZW50VHlwZUFsbDsKLQkJCQlpZiAocG9ydENvbnRlbnRUeXBlcyA9PSBudWxsIHx8IHBvcnRDb250ZW50VHlwZXMubGVuZ3RoID09IDEpIHsKLQkJCQkJcyA9IG5ldyBTdHJpbmdbXSB7IGFsbCB9OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBzaXplID0gcG9ydENvbnRlbnRUeXBlcy5sZW5ndGg7Ci0JCQkJCXMgPSBuZXcgU3RyaW5nW3NpemUrMV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlzW2ldID0gTW9uaXRvckxhYmVsUHJvdmlkZXIuZ2V0Q29udGVudFR5cGVTdHJpbmcocG9ydENvbnRlbnRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQkJc1tzaXplXSA9IGFsbDsKLQkJCQl9Ci0JCQkJY29tYm8uc2V0SXRlbXMocyk7Ci0JCQkJY29tYm8uc2V0VGV4dChhbGwpOwotCQkJfQotCQl9KTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCWlmIChwb3J0ICE9IG51bGwpIHsKLQkJCXBvcnRDaGFuZ2VkID0gdHJ1ZTsKLQkJCVN0cmluZ1tdIGN0ID0gY29udGVudFR5cGVzOwotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBvcnQpKTsKLQkJCWlmIChjdCAhPSBudWxsICYmIGN0Lmxlbmd0aCA+IDApCi0JCQkJY29tYm8uc2V0VGV4dChNb25pdG9yTGFiZWxQcm92aWRlci5nZXRDb250ZW50VHlwZVN0cmluZyhjdFswXSkpOwotCQl9IGVsc2UgaWYgKHRhYmxlVmlld2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJCQlpZiAob2JqICE9IG51bGwpCi0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iaikpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQkKLQkJcG9ydENoYW5nZWQgPSBmYWxzZTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNb25pdG9yUG9ydCgpIHsKLQkJcmV0dXJuIG1vbml0b3JQb3J0OwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldFNlcnZlclBvcnQoKSB7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjb250ZW50VHlwZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyYTc4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vbml0b3JlZFNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIE1vbml0b3IgcG9ydCBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQlwdWJsaWMgTW9uaXRvckxhYmVsUHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChwb3J0LmlzU3RhcnRlZCgpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX01PTklUT1JfT04pOwotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfTU9OSVRPUl9PRkYpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhcnRlZDsKLQkJCXJldHVybiBNZXNzYWdlcy5zdG9wcGVkOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpCi0JCQlyZXR1cm4gbm90TnVsbChwb3J0LmdldFNlcnZlclBvcnQoKS5nZXROYW1lKCkpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKQotCQkJcmV0dXJuIHBvcnQuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSArICIiOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKQotCQkJcmV0dXJuIHBvcnQuZ2V0TW9uaXRvclBvcnQoKSArICIiOwotCQllbHNlIHsKLQkJCVN0cmluZ1tdIGNvbnRlbnQgPSBwb3J0LmdldENvbnRlbnRUeXBlcygpOwotCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50Lmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVBbGw7Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBzaXplID0gY29udGVudC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQkJc2IuYXBwZW5kKGdldENvbnRlbnRUeXBlU3RyaW5nKGNvbnRlbnRbaV0pKTsKLQkJCX0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlU3RyaW5nKFN0cmluZyBzKSB7Ci0JCWlmICgid2ViIi5lcXVhbHMocykpCi0JCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViOwotCQllbHNlIGlmICgid2Vic2VydmljZXMiLmVxdWFscyhzKSkKLQkJCXJldHVybiBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWJTZXJ2aWNlczsKLQkJZWxzZQotCQkJcmV0dXJuIHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MjIxYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBNb25pdG9yIHBvcnQgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQlwdWJsaWMgUG9ydENvbnRlbnRQcm92aWRlcihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclBvcnRzKG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjc0ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci0vKioKLSAqIFNlcnZlciBwb3J0IGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUG9ydExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBQb3J0TGFiZWxQcm92aWRlcihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQlyZXR1cm4gbm90TnVsbChwb3J0LmdldE5hbWUoKSk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpCi0JCQlyZXR1cm4gcG9ydC5nZXRQb3J0KCkgKyAiIjsKLQkJZWxzZQotCQkJcmV0dXJuICIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjczOWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBJUnVudGltZSBkZWZhdWx0UnVudGltZTsKLQlwcm90ZWN0ZWQgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOwotCX0KLQkKLQljbGFzcyBSdW50aW1lVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkJYm9vbGVhbiBzb3J0QnlOYW1lOwotCQlwdWJsaWMgUnVudGltZVZpZXdlclNvcnRlcihib29sZWFuIHNvcnRCeU5hbWUpIHsKLQkJCXRoaXMuc29ydEJ5TmFtZSA9IHNvcnRCeU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJSVJ1bnRpbWUgcjEgPSAoSVJ1bnRpbWUpIGUxOwotCQkJSVJ1bnRpbWUgcjIgPSAoSVJ1bnRpbWUpIGUyOwotCQkJaWYgKHNvcnRCeU5hbWUpCi0JCQkJcmV0dXJuIGdldENvbXBhcmF0b3IoKS5jb21wYXJlKG5vdE51bGwocjEuZ2V0TmFtZSgpKSwgbm90TnVsbChyMi5nZXROYW1lKCkpKTsKLQkJCQotCQkJaWYgKHIxLmdldFJ1bnRpbWVUeXBlKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAocjIuZ2V0UnVudGltZVR5cGUoKSA9PSBudWxsKQotCQkJCXJldHVybiAxOwotCQkJcmV0dXJuIGdldENvbXBhcmF0b3IoKS5jb21wYXJlKG5vdE51bGwocjEuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCkpLCBub3ROdWxsKHIyLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQkJaWYgKHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7Ci0JCQlyZXR1cm4gczsKLQkJfQotCX0KLQkKLQlwdWJsaWMgUnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMCwgMTYwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5OYW1lKTsKLQkJY29sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFJ1bnRpbWVWaWV3ZXJTb3J0ZXIodHJ1ZSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDAsIDEyNSwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29sdW1uVHlwZSk7Ci0JCWNvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBSdW50aW1lVmlld2VyU29ydGVyKGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSdW50aW1lQ29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKG9ialtpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyJuYW1lIiwgInR5cGUifSk7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUnVudGltZVZpZXdlclNvcnRlcih0cnVlKSk7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUnVudGltZSkKLQkJCQkJc2VsZWN0aW9uID0gKElSdW50aW1lKSBvYmo7Ci0JCQkJZWxzZQotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCWxpc3RlbmVyLnJ1bnRpbWVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnbCcpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBnZXRTZWxlY3RlZFJ1bnRpbWUoKTsKLQkJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydW50aW1lLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCQl3Yy5zZXRSZWFkT25seSghcnVudGltZS5pc1JlYWRPbmx5KCkpOwotCQkJCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7Ci0JCQkJCQlyZWZyZXNoKHJ1bnRpbWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGFmdGVyIGFkZGluZyBhbiBpdGVtIGRvIHRoZSBwYWNraW5nIG9mIHRoZSB0YWJsZQotCQlpZiAodGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKQotCQkJCWNvbHVtbnNbaV0ucGFjaygpOwotCQkJdGFibGUucGFjaygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoKSB7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcigpIHsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgTG9ja2VkVGFibGVWaWV3ZXIodGFibGUpOwotCX0KLQotCXB1YmxpYyBJUnVudGltZSBnZXRTZWxlY3RlZFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2U2NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWU7Ci0vKioKLSAqIFJ1bnRpbWUgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCEoKFJ1bnRpbWUpcnVudGltZXNbaV0pLmlzUHJpdmF0ZSgpKQotCQkJCQlsaXN0LmFkZChydW50aW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLyoqCi0gKiBSdW50aW1lIHRhYmxlIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSUxvY2tlZExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKGRlY29yYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQkJCUltYWdlIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlYzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG5vdE51bGwocnVudGltZS5nZXROYW1lKCkpOwotCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQodGV4dCwgZWxlbWVudCk7Ci0JCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVjOwotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vdE51bGwocnVudGltZVR5cGUuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiAiIjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJcmV0dXJuIHJ1bnRpbWUuaXNSZWFkT25seSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNWFkZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogUnVudGltZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIFJ1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKTsKLQkJCQl0cnkgewotCQkJCQlUcmVlRWxlbWVudCBlbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXRWZW5kb3IoKSk7Ci0JCQkJCWVsZS5jb250ZW50cy5hZGQocnVudGltZXNbaV0pOwotCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KHJ1bnRpbWVzW2ldLCBlbGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBpbiBydW50aW1lIGNvbnRlbnQgcHJvdmlkZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDAzNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBSdW50aW1lIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFJ1bnRpbWVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJc3VwZXIoZGVjb3JhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKLQkJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotCQkJCUltYWdlIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCXJldHVybiBkZWM7Ci0JCQl9Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0SW1hZ2VJbXBsKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCVN0cmluZyB0ZXh0ID0gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBydW50aW1lKTsKLQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCXJldHVybiBkZWM7Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vdE51bGwocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzBjYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkV4dGVuc2lvblV0aWxpdHk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewotCXByb3RlY3RlZCBJUnVudGltZVR5cGUgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBydW50aW1lVHlwZUlkOwotCi0JcHJvdGVjdGVkIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBydW50aW1lVHlwZVNlbGVjdGVkKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSk7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVUeXBlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3JlYXRpb24sIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCXRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQkJCi0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoY3JlYXRpb24sIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKLQkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCQlzZWxlY3Rpb24gPSAoSVJ1bnRpbWVUeXBlKSBvYmo7Ci0JCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCQlzZXREZXNjcmlwdGlvbigiIik7Ci0JCQkJfQotCQkJCWxpc3RlbmVyLnJ1bnRpbWVUeXBlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRGVmYXVsdFZpZXdlclNvcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLnJ1bnRpbWVUeXBlQ29tcFRyZWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoY3JlYXRpb24sIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFNlbGVjdGVkUnVudGltZVR5cGUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxzTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlV2l6YXJkKENvbXBvc2l0ZSBjb21wKSB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgY29tcC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlDb21wb3NpdGUgYyA9IGNvbXAuZ2V0UGFyZW50KCk7Ci0JCWlmIChjIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCVNoZWxsIHMgPSAoU2hlbGwpIGM7Ci0JCQlzLmNsb3NlKCk7Ci0JCX0KLQkJY2xvc2VXaXphcmQoYyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc1NlbGVjdGVkKCkgewotCQlpZiAoRXh0ZW5zaW9uVXRpbGl0eS5sYXVuY2hFeHRlbnNpb25XaXphcmQoZ2V0U2hlbGwoKSwgTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJUaXRsZSwKLQkJCQlNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlckRlc2NyaXB0aW9uKSkgewotCQkJLy9yZWZyZXNoKCk7Ci0JCQljbG9zZVdpemFyZCh0aGlzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OWY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKLQotCS8qKgotCSAqIFJ1bnRpbWVUeXBlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjcmVhdGlvbiB0cnVlIHRvIGluY2x1ZGUgcnVudGltZXMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBjcmVhdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNyZWF0aW9uID0gY3JlYXRpb247Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihib29sZWFuIGNyZWF0aW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKGZhbHNlKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQkJdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uOwotCQkKLQkJZmlsbFRyZWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZVR5cGVzKHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGVzW2ldOwotCQkJCWlmICghY3JlYXRpb24gfHwgcnVudGltZVR5cGUuY2FuQ3JlYXRlKCkpIHsKLQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOwotCQkJCQllbGUuY29udGVudHMuYWRkKHJ1bnRpbWVUeXBlKTsKLQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChydW50aW1lVHlwZSwgZWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3M2M2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3IsIG9yIG51bGwgaWYgbm8gZGVjb3JhdG9yIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlzdXBlcihkZWNvcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwotCQlyZXR1cm4gbm90TnVsbChydW50aW1lVHlwZS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyNDY2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRUcmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlclRhYmxlTGFiZWxQcm92aWRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnM7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyLCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJVHJlZSB0cmVlMiA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uLnNldFRleHQoTWVzc2FnZXMudmlld1NlcnZlcik7Ci0JCWNvbHVtbi5zZXRXaWR0aCgzMjUpOwotCQkKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5TSU5HTEUpOwotCQljb2x1bW4yLnNldFRleHQoTWVzc2FnZXMudmlld1N0YXRlKTsKLQkJY29sdW1uMi5zZXRXaWR0aCgxMDApOwotCQkKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlLCBsYXVuY2hNb2RlKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCi0JCS8vSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlTGFiZWxQcm92aWRlcigpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFNlcnZlclRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMSk7Ci0JCQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQkJc2VsZWN0aW9uID0gKElTZXJ2ZXIpIG9iajsKLQkJCQkJc2V0RGVzY3JpcHRpb24oc2VsZWN0aW9uLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldERlc2NyaXB0aW9uKCIiKTsKLQkJCQl9Ci0JCQkJbGlzdGVuZXIuc2VydmVyU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZSgpIHsKLQkJdHJlZSA9IG5ldyBGaWx0ZXJlZFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04sIG5ldyBTZXJ2ZXJQYXR0ZXJuRmlsdGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKLQkJaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zID0gYjsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGIpOwotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlkZWZlckluaXRpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsKCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLndpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIGdldFNlbGVjdGVkU2VydmVyKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZXJ2ZXIpLCB0cnVlKTsKLQkJZWxzZQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQkJCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIC0gd2l6YXJkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJQYXR0ZXJuRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclBhdHRlcm5GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZTg5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclBhdHRlcm5GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QYXR0ZXJuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgUGF0dGVybkZpbHRlciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMZWFmTWF0Y2goVmlld2VyIHZpZXdlciwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBiID0gc3VwZXIuaXNMZWFmTWF0Y2godmlld2VyLCBlbGVtZW50KTsKLQkJaWYgKGIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCU9iamVjdCBwYXJlbnQgPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSAoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKQotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsYWJlbFRleHQgPSAoKElMYWJlbFByb3ZpZGVyKSAoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikuZ2V0TGFiZWxQcm92aWRlcigpKQotCQkJCQkuZ2V0VGV4dChwYXJlbnQpOwotCQkJCi0JCQlpZiAobGFiZWxUZXh0ICE9IG51bGwgJiYgd29yZE1hdGNoZXMobGFiZWxUZXh0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUgJiYgbWF0Y2hlc1J1bnRpbWVUeXBlKChJUnVudGltZVR5cGUpIGVsZW1lbnQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUgJiYgbWF0Y2hlc1J1bnRpbWUoKElSdW50aW1lKSBlbGVtZW50KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlICYmIG1hdGNoZXNTZXJ2ZXJUeXBlKChJU2VydmVyVHlwZSkgZWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyICYmIG1hdGNoZXNTZXJ2ZXIoKElTZXJ2ZXIpIGVsZW1lbnQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc01vZHVsZVR5cGUoSU1vZHVsZVR5cGUgbXQpIHsKLQkJU3RyaW5nIHRleHQgPSBtdC5nZXROYW1lKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQl0ZXh0ID0gbXQuZ2V0VmVyc2lvbigpOwotCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnQpIHsKLQkJU3RyaW5nIHRleHQgPSBydC5nZXROYW1lKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQl0ZXh0ID0gcnQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRleHQgPSBydC5nZXRWZW5kb3IoKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRleHQgPSBydC5nZXRWZXJzaW9uKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJSU1vZHVsZVR5cGVbXSBtdHMgPSBydC5nZXRNb2R1bGVUeXBlcygpOwotCQlpZiAobXRzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbXRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKG1hdGNoZXNNb2R1bGVUeXBlKG10c1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzUnVudGltZShJUnVudGltZSByKSB7Ci0JCVN0cmluZyB0ZXh0ID0gci5nZXROYW1lKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoci5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCXRleHQgPSByLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJdGV4dCA9IHIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHIuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmIG1hdGNoZXNSdW50aW1lVHlwZShyLmdldFJ1bnRpbWVUeXBlKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2VydmVyVHlwZShJU2VydmVyVHlwZSBzdCkgewotCQlTdHJpbmcgdGV4dCA9IHN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc3QuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmIG1hdGNoZXNSdW50aW1lVHlwZShzdC5nZXRSdW50aW1lVHlwZSgpKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1NlcnZlcihJU2VydmVyIHN0KSB7Ci0JCVN0cmluZyB0ZXh0ID0gc3QuZ2V0TmFtZSgpOwotCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHN0LmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIG1hdGNoZXNTZXJ2ZXJUeXBlKHN0LmdldFNlcnZlclR5cGUoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NThhMTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnM7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIoZmFsc2UpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJCi0JCWZpbGxUcmVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKLQkJaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zID0gYjsKLQkJZmlsbFRyZWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFRyZWUoKSB7Ci0JCWNsZWFuKCk7Ci0JCUxpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFRyZWVFbGVtZW50PigpOwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoYWNjZXB0U2VydmVyKHNlcnZlcnNbaV0pKSB7Ci0JCQkJCVRyZWVFbGVtZW50IHRlID0gZ2V0T3JDcmVhdGUobGlzdCwgc2VydmVyc1tpXS5nZXRIb3N0KCkpOwotCQkJCQl0ZS5jb250ZW50cy5hZGQoc2VydmVyc1tpXSk7Ci0JCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoc2VydmVyc1tpXSwgdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbGVtZW50cyA9IGxpc3QudG9BcnJheSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdFNlcnZlcihJU2VydmVyIHNlcnZlcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbGF1bmNoTW9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghU2VydmVyVUlQbHVnaW4uaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoc2VydmVyLCBsYXVuY2hNb2RlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJaWYgKGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucykgewotCQkJaWYgKCFTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdC5nZXRJZCgpLCBudWxsKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10LmdldElkKCksIG10LmdldFZlcnNpb24oKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ0NTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5leHRlbnNpb24uRXh0ZW5zaW9uVXRpbGl0eTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVNlcnZlclR5cGUgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsU2VsZWN0aW9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbGhvc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOwotCi0JcHVibGljIGludGVyZmFjZSBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJUeXBlU2VsZWN0ZWQoSVNlcnZlclR5cGUgdHlwZSk7Ci0JfQotCi0JcHVibGljIFNlcnZlclR5cGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQkJdGhpcy5zZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlSWQ7Ci0JCQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKLQkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewotCQkJCQlzZWxlY3Rpb24gPSAoSVNlcnZlclR5cGUpIG9iajsKLQkJCQkJc2V0RGVzY3JpcHRpb24oc2VsZWN0aW9uLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldERlc2NyaXB0aW9uKCIiKTsKLQkJCQl9Ci0JCQkJbGlzdGVuZXIuc2VydmVyVHlwZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IERlZmF1bHRWaWV3ZXJTb3J0ZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgewotCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOwotCQkJZGVmZXJJbml0aWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQkJCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIC0gd2l6YXJkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRIb3N0KGJvb2xlYW4gbmV3SG9zdCkgewotCQlpZiAoaXNMb2NhbGhvc3QgPT0gbmV3SG9zdCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlzTG9jYWxob3N0ID0gbmV3SG9zdDsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0TG9jYWxob3N0KGlzTG9jYWxob3N0KTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCS8vdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5zZXJ2ZXJUeXBlQ29tcExhYmVsOwotCX0KLQotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZWxlY3RlZFNlcnZlclR5cGUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxzTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlV2l6YXJkKENvbXBvc2l0ZSBjb21wKSB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgY29tcC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCUNvbXBvc2l0ZSBjID0gY29tcC5nZXRQYXJlbnQoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJU2hlbGwgcyA9IChTaGVsbCkgYzsKLQkJCXMuY2xvc2UoKTsKLQkJfQotCQljbG9zZVdpemFyZChjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzU2VsZWN0ZWQoKSB7Ci0JCWlmIChFeHRlbnNpb25VdGlsaXR5LmxhdW5jaEV4dGVuc2lvbldpemFyZChnZXRTaGVsbCgpLCBNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlLAotCQkJCU1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb24pKSB7Ci0JCQkvL3JlZnJlc2goKTsKLQkJCWNsb3NlV2l6YXJkKHRoaXMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjZjNlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBTZXJ2ZXIgdHlwZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBib29sZWFuIGxvY2FsaG9zdDsKLQotCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9uczsKLQotCS8qKgotCSAqIFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHR5cGUgaWQsIG9yIG51bGwgdG8gbWF0Y2ggYW55IGlkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQpIHsKLQkJc3VwZXIoZmFsc2UpOwotCQlsb2NhbGhvc3QgPSB0cnVlOwotCQkKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQkJdGhpcy5zZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlSWQ7Ci0JCQotCQlmaWxsVHJlZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQotCQlMaXN0PFRyZWVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUcmVlRWxlbWVudD4oKTsKLQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJaWYgKHNlcnZlclR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyVHlwZXNbaV07Ci0JCQkJaWYgKGluY2x1ZGUoc2VydmVyVHlwZSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCQkJCVRyZWVFbGVtZW50IGVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpKTsKLQkJCQkJCWVsZS5jb250ZW50cy5hZGQoc2VydmVyVHlwZSk7Ci0JCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KHNlcnZlclR5cGUsIGVsZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW4gc2VydmVyIGNvbmZpZ3VyYXRpb24gY29udGVudCBwcm92aWRlciIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnRzID0gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlSWQgIT0gbnVsbCAmJiAhc2VydmVyVHlwZS5nZXRJZCgpLnN0YXJ0c1dpdGgoc2VydmVyVHlwZUlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlTdHJpbmcgbW9kdWxlVHlwZUlkID0gbnVsbDsKLQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkKLQkJCW1vZHVsZVR5cGVJZCA9IG1vZHVsZVR5cGUuZ2V0SWQoKTsKLQkJaWYgKGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucykgewotCQkJaWYgKCFTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZVR5cGVJZCwgbnVsbCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1vZHVsZVZlcnNpb24gPSBudWxsOwotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkKLQkJCQltb2R1bGVWZXJzaW9uID0gbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZUlkLCBtb2R1bGVWZXJzaW9uKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChsb2NhbGhvc3QgfHwgc2VydmVyVHlwZS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0Zvck5vblN0dWJFbnZpcm9ubWVudFJ1bnRpbWUoSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCWlmIChydW50aW1lcyA9PSBudWxsIHx8IHJ1bnRpbWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoIXJ1bnRpbWVzW2ldLmlzU3R1YigpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGhvc3QoYm9vbGVhbiBsb2NhbCkgewotCQlsb2NhbGhvc3QgPSBsb2NhbDsKLQkJZmlsbFRyZWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCWZpbGxUcmVlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcyMjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIFNlcnZlciB0eXBlIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlzdXBlcihkZWNvcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVNlcnZlclR5cGUgdHlwZSA9IChJU2VydmVyVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlTZXJ2ZXJUeXBlIHR5cGUgPSAoSVNlcnZlclR5cGUpIGVsZW1lbnQ7Ci0JCXJldHVybiBub3ROdWxsKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9WZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NzBjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi4iOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSB2ZXJzaW9uOwotCi0JcHVibGljIFZlcnNpb24oU3RyaW5nIHMpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCBTRVBBUkFUT1IpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCQkJaW50IHNpemUgPSBzdHIubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChzdHIuY2hhckF0KGkpKSkKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBjb250YWluICciICsgc3RyLmNoYXJBdChpKSArICInIik7Ci0JCQl9Ci0JCQlsaXN0LmFkZChzdHIpOwotCQl9Ci0JCQotCQl2ZXJzaW9uID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh2ZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZlcnNpb24gcGFyc2VWZXJzaW9uKFN0cmluZyBzKSB7Ci0JCXJldHVybiBuZXcgVmVyc2lvbihzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKFZlcnNpb24gdjEsIFZlcnNpb24gdjIpIHsKLQkJaW50IHYxbCA9IHYxLnZlcnNpb24ubGVuZ3RoOwotCQlpbnQgdjJsID0gdjIudmVyc2lvbi5sZW5ndGg7Ci0JCQotCQlpbnQgc2l6ZSA9IE1hdGgubWluKHYxbCwgdjJsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZG91YmxlIGQxID0gRG91YmxlLnBhcnNlRG91YmxlKHYxLnZlcnNpb25baV0pOwotCQkJCWRvdWJsZSBkMiA9IERvdWJsZS5wYXJzZURvdWJsZSh2Mi52ZXJzaW9uW2ldKTsKLQkJCQkKLQkJCQlpbnQgYyA9IERvdWJsZS5jb21wYXJlKGQxLCBkMik7Ci0JCQkJaWYgKGMgIT0gMCkKLQkJCQkJcmV0dXJuIGM7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCWludCBjID0gdjEudmVyc2lvbltpXS5jb21wYXJlVG8odjIudmVyc2lvbltpXSk7Ci0JCQlpZiAoYyAhPSAwKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCWlmICh2MWwgPT0gdjJsKQotCQkJcmV0dXJuIDA7Ci0JCWlmICh2MWwgPiB2MmwpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwMmUyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL09wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogQWN0aW9uIHRvIG9wZW4gdGhlIFdlYiBicm9zd2VyLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCS8qKgotCSAqIE9wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoaXMgYWN0aW9uIGRlbGVnYXRlLiAgVGhlIGltcGxlbWVudG9yIHNob3VsZCB1bmhvb2sgYW55IHJlZmVyZW5jZXMKLQkgKiB0byBpdHNlbGYgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3Rpb24gY2FuIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KLQkgKgotCSAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4KLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZQotCSAqICAgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Lk5BVklHQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKLQkJCWJyb3dzZXIub3BlblVSTChudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgYnJvd3NlciIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50ZXJzIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBjaGFuZ2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKLQkgKiBhY3Rpb24gb3IgdG8gbW9kaWZ5IG90aGVyIHByZXNlbnRhdGlvbiBwcm9wZXJ0aWVzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjBmNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSUJyb3dzZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyVXRpbDsKLS8qKgotICogQWN0aW9uIHRvIG9wZW4gdGhlIFdlYiBicm9zd2VyLgotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlMiB7Ci0JLyoqCi0JICogVGhlIG1lbnUgY3JlYXRlZCBieSB0aGlzIGFjdGlvbgotCSAqLwotCXByaXZhdGUgTWVudSBmTWVudTsKLQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjcmVhdGVNZW51ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBTd2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2V0TWVudShudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGlzIGFjdGlvbidzIGRyb3AtZG93biBtZW51LCBkaXNwb3NpbmcgdGhlIHByZXZpb3VzIG1lbnUuCi0JICogCi0JICogQHBhcmFtIG1lbnUgdGhlIG5ldyBtZW51Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0JCWlmIChmTWVudSAhPSBudWxsKSB7Ci0JCQlmTWVudS5kaXNwb3NlKCk7Ci0JCX0KLQkJZk1lbnUgPSBtZW51OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBhY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBtZW51IHdpdGggYW4gYWNjZWxlcmF0b3Igc3BlY2lmaWVkCi0JICogYnkgdGhlIGdpdmVuIG51bWJlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBhZGQgdGhlIGFjdGlvbiB0bwotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBhZGQKLQkgKiBAcGFyYW0gYWNjZWxlcmF0b3IgdGhlIG51bWJlciB0aGF0IHNob3VsZCBhcHBlYXIgYXMgYW4gYWNjZWxlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoTWVudSBtZW51LCBJQWN0aW9uIGFjdGlvbiwgaW50IGFjY2VsZXJhdG9yKSB7Ci0JCVN0cmluZ0J1ZmZlciBsYWJlbD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoYWNjZWxlcmF0b3IgPj0gMCAmJiBhY2NlbGVyYXRvciA8IDEwKSB7Ci0JCQkvL2FkZCB0aGUgbnVtZXJpY2FsIGFjY2VsZXJhdG9yCi0JCQlsYWJlbC5hcHBlbmQoJyYnKTsKLQkJCWxhYmVsLmFwcGVuZChhY2NlbGVyYXRvcik7Ci0JCQlsYWJlbC5hcHBlbmQoJyAnKTsKLQkJfQotCQlsYWJlbC5hcHBlbmQoYWN0aW9uLmdldFRleHQoKSk7Ci0JCWFjdGlvbi5zZXRUZXh0KGxhYmVsLnRvU3RyaW5nKCkpOwotCQlBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JCWl0ZW0uZmlsbChtZW51LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGRyb3AtZG93biBtZW51IHdpdGggZmF2b3JpdGVzIGFuZCBsYXVuY2ggaGlzdG9yeSwKLQkgKiBsYXVuY2ggc2hvcnRjdXRzLCBhbmQgYW4gYWN0aW9uIHRvIG9wZW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEBwYXJhbSBtZW51IHRoZSBtZW51IHRvIGZpbGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLQkJaW50IGkgPSAwOwotCQlpZiAoV2ViQnJvd3NlclV0aWwuY2FuVXNlSW50ZXJuYWxXZWJCcm93c2VyKCkpIHsKLQkJCWFkZFRvTWVudShtZW51LCBuZXcgU3dpdGNoRGVmYXVsdEJyb3dzZXJBY3Rpb24obnVsbCwgV2ViQnJvd3NlclByZWZlcmVuY2UuZ2V0QnJvd3NlckNob2ljZSgpID09IFdlYkJyb3dzZXJQcmVmZXJlbmNlLklOVEVSTkFMLCBudWxsKSwgaSsrKTsKLQkJfQotCQlJQnJvd3NlckRlc2NyaXB0b3IgY3VycmVudCA9IEJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFdlYkJyb3dzZXIoKTsKLQkJQnJvd3Nlck1hbmFnZXIgYnJvd3Nlck1hbmFnZXIgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGJyb3dzZXJNYW5hZ2VyLmdldFdlYkJyb3dzZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUJyb3dzZXJEZXNjcmlwdG9yIGJyb3dzZXIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlhZGRUb01lbnUobWVudSwgbmV3IFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKGJyb3dzZXIsIFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSAhPSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCAmJiBicm93c2VyLmVxdWFscyhjdXJyZW50KSwgYnJvd3Nlck1hbmFnZXIpLCBpKyspOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWVudSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0TWVudSgpIHsKLQkJLy8gQWRkIGxpc3RlbmVyIHRvIHJlcG9wdWxhdGUgdGhlIG1lbnUgZWFjaCB0aW1lCi0JCS8vIGl0IGlzIHNob3duIGJlY2F1c2Ugb2YgZHluYW1pYyBoaXN0b3J5IGxpc3QKLQkJZk1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCS8vaWYgKHJlY3JlYXRlTWVudSkgewotCQkJCQlNZW51IG0gPSAoTWVudSkgZS53aWRnZXQ7Ci0JCQkJCU1lbnVJdGVtW10gaXRlbXMgPSBtLmdldEl0ZW1zKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlmaWxsTWVudShtKTsKLQkJCQkJcmVjcmVhdGVNZW51ID0gZmFsc2U7Ci0JCQkJLy99Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCXNldE1lbnUobmV3IE1lbnUocGFyZW50KSk7Ci0JCS8vZmlsbE1lbnUoZk1lbnUpOwotCQlpbml0TWVudSgpOwotCQlyZXR1cm4gZk1lbnU7Ci0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOwotCQkvL2ZpbGxNZW51KGZNZW51KTsKLQkJaW5pdE1lbnUoKTsKLQkJcmV0dXJuIGZNZW51OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjhhMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JQnJvd3NlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiB0aGUgV2ViIGJyb3dzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIElCcm93c2VyRGVzY3JpcHRvciB3ZWJicm93c2VyOwotCXByb3RlY3RlZCBCcm93c2VyTWFuYWdlciBicm93c2VyTWFuYWdlcjsKLQotCS8qKgotCSAqIFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHdlYmJyb3dzZXIgYSBicm93c2VyCi0JICogQHBhcmFtIGN1cnJlbnQgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IGJyb3dzZXIKLQkgKiBAcGFyYW0gbWFuYWdlciB0aGUgYnJvd3NlciBtYW5hZ2VyCi0JICovCi0JcHVibGljIFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKElCcm93c2VyRGVzY3JpcHRvciB3ZWJicm93c2VyLCBib29sZWFuIGN1cnJlbnQsIEJyb3dzZXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXRoaXMud2ViYnJvd3NlciA9IHdlYmJyb3dzZXI7Ci0JCXRoaXMuYnJvd3Nlck1hbmFnZXIgPSBtYW5hZ2VyOwotCQlpZiAod2ViYnJvd3NlciA9PSBudWxsKQotCQkJc2V0VGV4dChNZXNzYWdlcy5pbnRlcm5hbFdlYkJyb3dzZXJOYW1lKTsKLQkJZWxzZQotCQkJc2V0VGV4dCh3ZWJicm93c2VyLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAoY3VycmVudCkKLQkJCXNldENoZWNrZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAod2ViYnJvd3NlciA9PSBudWxsKQotCQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCk7Ci0JCWVsc2UgewotCQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShXZWJCcm93c2VyUHJlZmVyZW5jZS5FWFRFUk5BTCk7Ci0JCQlicm93c2VyTWFuYWdlci5zZXRDdXJyZW50V2ViQnJvd3Nlcih3ZWJicm93c2VyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9BYnN0cmFjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY4MjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9BYnN0cmFjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBXaXphcmQgdGhhdCBjb250YWlucyBoZWxwZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIEFic3RyYWN0V2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB3b3JrYmVuY2guCi0JICogCi0JICogQHJldHVybiB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHdvcmtiZW5jaCBhbmQgY3VycmVudCBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIG5ld1dvcmtiZW5jaAotCSAqIEBwYXJhbSBuZXdTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggbmV3V29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJd29ya2JlbmNoID0gbmV3V29ya2JlbmNoOwotCQlzZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9FeHRlbnNpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9FeHRlbnNpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwNGU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvRXh0ZW5zaW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5leHRlbnNpb24uRXh0ZW5zaW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5FeHRlbnNpb25XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5MaWNlbnNlV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbGxhYmxlIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvbldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBFeHRlbnNpb25XaXphcmQuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRoZSB3aXphcmQgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGVzY3JpcHRpb24gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25XaXphcmQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcih0aXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCWxpc3QuYWRkKG5ldyBFeHRlbnNpb25XaXphcmRGcmFnbWVudCgpKTsKLQkJCQlsaXN0LmFkZChuZXcgTGljZW5zZVdpemFyZEZyYWdtZW50KCkpOwotCQkJCWxpc3QuYWRkKG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCUlGZWF0dXJlIGlzID0gKElGZWF0dXJlKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19GRUFUVVJFKTsKLQkJCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJCWluc3RhbGwoaXMpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlTGljZW5zZShUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCUlGZWF0dXJlIGlzID0gKElGZWF0dXJlKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfRkVBVFVSRSk7Ci0JCUlGZWF0dXJlIGxzID0gKElGZWF0dXJlKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1NFUlZFUik7Ci0JCWlmIChpcyA9PSBscykKLQkJCXJldHVybjsKLQkJCi0JCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0UsIExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1VOS05PV04pOwotCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCwgbnVsbCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfU0VSVkVSLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTGljZW5zZShJV2l6YXJkSGFuZGxlIHdpemFyZCwgZmluYWwgVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlmaW5hbCBJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfRkVBVFVSRSk7Ci0JCUlGZWF0dXJlIGxzID0gKElGZWF0dXJlKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1NFUlZFUik7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhscykpCi0JCQlyZXR1cm47Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCVN0cmluZyBsaWNlbnNlID0gTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfVU5LTk9XTjsKLQkJCQlsaWNlbnNlID0gRXh0ZW5zaW9uVXRpbGl0eS5nZXRMaWNlbnNlKGZlYXR1cmUpOwotCQkJCWlmIChsaWNlbnNlID09IG51bGwpCi0JCQkJCWxpY2Vuc2UgPSBMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9OT05FOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0UsIGxpY2Vuc2UpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfU0VSVkVSLCBmZWF0dXJlKTsKLQkJCX0KLQkJfTsKLQkJCi0JCXRyeSB7Ci0JCQl3aXphcmQucnVuKHRydWUsIGZhbHNlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aXRoIHJ1bm5hYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RhbGwgYSBuZXcgZmVhdHVyZS4KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbnN0YWxsKGZpbmFsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWZpbmFsIGJvb2xlYW5bXSBiID0gbmV3IGJvb2xlYW5bMV07Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJDb25maXJtLCBmZWF0dXJlLmdldExhYmVsKCkpOwotCQkJCWJbMF0gPSBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBtc2cpOwotCQkJfQotCQl9KTsKLQkJaWYgKCFiWzBdKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlckpvYiwgZmVhdHVyZS5nZXRMYWJlbCgpKTsKLQkJSm9iIGpvYiA9IG5ldyBKb2IobmFtZSkgewotCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCUV4dGVuc2lvblV0aWxpdHkuaW5zdGFsbChmZWF0dXJlLCBtb25pdG9yKTsKLQkJCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXByb21wdFJlc3RhcnQoKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHRvIHJlc3RhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb21wdFJlc3RhcnQoKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCU1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJSZXN0YXJ0KSkgewotCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlJlc3RhcnQgdGhyZWFkIikgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXNsZWVwKDEwMDApOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQl0LnN0YXJ0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL01vZGlmeU1vZHVsZXNXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9Nb2RpZnlNb2R1bGVzV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmI3NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL01vZGlmeU1vZHVsZXNXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSB3aXphcmQgdXNlZCB0byBhZGQgYW5kIHJlbW92ZSBtb2R1bGVzLgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZ5TW9kdWxlc1dpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgewotCXN0YXRpYyBjbGFzcyBNb2RpZnlNb2R1bGVzV2l6YXJkMiBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpKTsKLQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7Ci0JCQkKLQkJCWxpc3QuYWRkKG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlJU2VydmVyQXR0cmlidXRlcyBzdnIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQkJCQlpZiAoc3ZyIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc3ZyOwotCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCAmJiAoKFNlcnZlcilzZXJ2ZXIpLmdldEF1dG9QdWJsaXNoU2V0dGluZygpICE9IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSkgewotCQkJCQkJCUlBZGFwdGFibGUgaW5mbyA9IG51bGw7Ci0JCQkJCQkJLypJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCQkJCQkJcmV0dXJuIHNoZWxsOwotCQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OyovCi0JCQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5TW9kdWxlc1dpemFyZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoTWVzc2FnZXMud2l6TW9kdWxlV2l6YXJkVGl0bGUsIG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkMigpKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdSdW50aW1lV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTc4NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLyoqCi0gKiBBIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIE5ld1J1bnRpbWVXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JLyoqCi0JICogTmV3UnVudGltZVdpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXdSdW50aW1lV2l6YXJkKCkgewotCQlzdXBlcihNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChuZXcgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KCkpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJfQotCQl9KTsKLQotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBuZXdXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2ZXJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2ZXJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZGQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLS8qKgotICogQSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IHNlcnZlciBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JLyoqCi0JICogTmV3U2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5ld1NlcnZlcldpemFyZCgpIHsKLQkJdGhpcyhudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTmV3U2VydmVyV2l6YXJkKGZpbmFsIFN0cmluZ1tdIGlkcywgZmluYWwgU3RyaW5nW10gdmFsdWVzKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLndpek5ld1NlcnZlcldpemFyZFRpdGxlLCBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQobmV3IE5ld1NlcnZlcldpemFyZEZyYWdtZW50KCkpOwotCQkJCQotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVNlcnZlckZyYWdtZW50KTsKLQkJCQkKLQkJCQlsaXN0LmFkZChuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KCkpOwotCQkJCWxpc3QuYWRkKG5ldyBUYXNrc1dpemFyZEZyYWdtZW50KCkpOwotCQkJCQotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7Ci0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZUhvc3RuYW1lRnJhZ21lbnQpOwotCQkJfQotCQl9KTsKLQkJCi0JCWlmIChpZHMgIT0gbnVsbCkgewotCQkJVGFza01vZGVsIHRhc2tNb2RlbDIgPSBnZXRUYXNrTW9kZWwoKTsKLQkJCWludCBzaXplID0gaWRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdGFza01vZGVsMi5wdXRPYmplY3QoaWRzW2ldLCB2YWx1ZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1J1bk9uU2VydmVyV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvUnVuT25TZXJ2ZXJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwMWY0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvUnVuT25TZXJ2ZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgd2l6YXJkIHVzZWQgZm9yIFJ1biBvbiBTZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgewotCS8qKgotCSAqIFJ1bk9uU2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QgYSBtb2R1bGUgYXJ0aWZhY3QKLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJXaXphcmQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKLQkJc3VwZXIoTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSwgbmV3IFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQobW9kdWxlLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCkpOwotCQkKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSk7Ci0JCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy53aXpQcm9maWxlT25TZXJ2ZXJUaXRsZSk7Ci0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSwgbGF1bmNoTW9kZSk7Ci0JfQotCi0JLyoqCi0JICogUnVuT25TZXJ2ZXJXaXphcmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBsYXVuY2ggbW9kZQotCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdCBhIG1vZHVsZSBhcnRpZmFjdAotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlcldpemFyZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgewotCQlzdXBlcihNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBuZXcgUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudChzZXJ2ZXIsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0KSk7Ci0JCQotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQotCQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKLQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKLQkJCi0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSwgbGF1bmNoTW9kZSk7Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJU2VydmVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHVzZSB0aGUgc2VydmVyIGFzIGEgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcnJlZFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19ERUZBVUxUX1NFUlZFUik7Ci0JCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2xpZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBJQ2xpZW50IGdldFNlbGVjdGVkQ2xpZW50KCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJQ2xpZW50KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhdW5jaGFibGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyCi0JICovCi0JcHVibGljIElMYXVuY2hhYmxlQWRhcHRlciBnZXRMYXVuY2hhYmxlQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUxhdW5jaGFibGVBZGFwdGVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFX0FEQVBURVIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQXBwZWFyKCkgewotCQlyZXR1cm4gZ2V0U2VydmVyKCkgPT0gbnVsbCB8fCBoYXNUYXNrcygpIHx8IGhhc0NsaWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGFza3MoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX1RBU0tTKTsKLQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyBtdWx0aXBsZSBjbGllbnRzIHRvIHNob3cuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHdpemFyZCBoYXMgbXVsdGlwbGUgY2xpZW50cywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0NsaWVudHMoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMpOwotCQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGQ3MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLldvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSB3aXphcmQgdXNlZCB0byBleGVjdXRlIHRhc2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1dpemFyZCBpbXBsZW1lbnRzIElXaXphcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRklOSVNIID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENBTkNFTCA9IDM7Ci0KLQlwcml2YXRlIExpc3Q8SVdpemFyZFBhZ2U+IHBhZ2VzOwotCXByaXZhdGUgYm9vbGVhbiBhZGRpbmdQYWdlczsKLQlwcml2YXRlIE1hcDxXaXphcmRGcmFnbWVudCwgVGFza1dpemFyZFBhZ2U+IGZyYWdtZW50RGF0YSA9IG5ldyBIYXNoTWFwPFdpemFyZEZyYWdtZW50LCBUYXNrV2l6YXJkUGFnZT4oKTsKLQlwcm90ZWN0ZWQgVGFza01vZGVsIHRhc2tNb2RlbDsKLQkKLQlwcml2YXRlIElXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNIZWxwQXZhaWxhYmxlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOwotCQotCXByaXZhdGUgUkdCIHRpdGxlQmFyQ29sb3IgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgd2luZG93VGl0bGUgPSBudWxsOwotCQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gbnVsbDsKLQkKLQlwcml2YXRlIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudDsKLQlwcml2YXRlIFdpemFyZEZyYWdtZW50IGN1cnJlbnRGcmFnbWVudDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrV2l6YXJkIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCByb290IGZyYWdtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgVGFza1dpemFyZChTdHJpbmcgdGl0bGUsIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzKHRpdGxlLCByb290RnJhZ21lbnQsIG51bGwpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhc2tXaXphcmQgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUsIHJvb3QgZnJhZ21lbnQsIGFuZCB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAotCSAqLwotCXB1YmxpYyBUYXNrV2l6YXJkKFN0cmluZyB0aXRsZSwgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50LCBUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh0aXRsZSAhPSBudWxsKQotCQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKLQkJCXRoaXMudGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQl9Ci0JCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiB0YXNrTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdEZyYWdtZW50KFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQl9Ci0JCi0JcHVibGljIFdpemFyZEZyYWdtZW50IGdldFJvb3RGcmFnbWVudCgpIHsKLQkJcmV0dXJuIHJvb3RGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBDYW5jZWwgdGhlIGNsaWVudCBzZWxlY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBDQU5DRUwsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY2UpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVRocm93YWJsZSB0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChnZXRDb250YWluZXIoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQllbHNlCi0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdGUpIHsKLQkJCXQgPSB0ZS5nZXRDYXVzZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdCA9IGU7Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FuY2VsbGluZyB0YXNrIHdpemFyZCIsIHQpOwotCQkKLQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKSk7Ci0JCX0gZWxzZQotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKGN1cnJlbnRGcmFnbWVudCAhPSBudWxsKQotCQkJY3VycmVudEZyYWdtZW50LmV4aXQoKTsKLQkJCi0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGNGcmFnbWVudCA9IGN1cnJlbnRGcmFnbWVudDsKLQotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkvLyBlbnRlciAmIGV4aXQgdGhlIHJlbWFpbmluZyBwYWdlcwotCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihjRnJhZ21lbnQpOwotCQkJCXdoaWxlIChpbmRleCA+IDAgJiYgaW5kZXggPCBsaXN0LnNpemUoKSAtIDEpIHsKLQkJCQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGxpc3QuZ2V0KCsraW5kZXgpOwotCQkJCQl0cnkgewotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZnJhZ21lbnQuZW50ZXIoKTsKLQkJCQkJCQkJZnJhZ21lbnQuZXhpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBlbnRlci9leGl0IHBhZ2UiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodXNlSm9iKCkpIHsKLQkJCQkJY2xhc3MgRmluaXNoV2l6YXJkSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQkJCXB1YmxpYyBGaW5pc2hXaXphcmRKb2IoKSB7Ci0JCQkJCQkJc3VwZXIoZ2V0Sm9iVGl0bGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIuZXF1YWxzKGZhbWlseSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgRklOSVNILCBtb25pdG9yMik7Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgd2l6YXJkIGpvYiIsIGNlKTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJRmluaXNoV2l6YXJkSm9iIGpvYiA9IG5ldyBGaW5pc2hXaXphcmRKb2IoKTsKLQkJCQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIEZJTklTSCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJVGhyb3dhYmxlIHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIocnVubmFibGUpKTsKLQkJCWVsc2UKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0ZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmluaXNoaW5nIHRhc2sgd2l6YXJkIiwgdGUpOwotCQkJdCA9IHRlLmdldENhdXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQgMiIsIGUpOwotCQkJdCA9IGU7Ci0JCX0KLQkJCi0JCS8vIFRPRE86IHNob3cgYmV0dGVyIGVycm9yIGRpYWxvZywgZS5nLiB3aGVuIFRvbWNhdCBjb25maWcgaXMgY29ycnVwdCB3aGlsZSBkb2luZyBBZGQvUmVtb3ZlCi0JCS8vIGl0IGN1cnJlbnRseSBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZSB0d2ljZQotCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY29tcGxldGluZyB3aXphcmQiLCB0KTsKLQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKSk7Ci0JCX0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKQotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQllbHNlCi0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJcGFnZXMuYWRkKHBhZ2UpOwotCQlwYWdlLnNldFdpemFyZCh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRhc2soV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQsIGJ5dGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHR5cGUgPT0gRklOSVNIKQotCQkJZnJhZ21lbnQucGVyZm9ybUZpbmlzaChtb25pdG9yKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBDQU5DRUwpCi0JCQlmcmFnbWVudC5wZXJmb3JtQ2FuY2VsKG1vbml0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZ2V0Q3VycmVudFdpemFyZEZyYWdtZW50KCkgewotCQlyZXR1cm4gY3VycmVudEZyYWdtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hXaXphcmRGcmFnbWVudChXaXphcmRGcmFnbWVudCBuZXdGcmFnbWVudCkgewotCQlMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJaW50IG9sZEluZGV4ID0gbGlzdC5pbmRleE9mKGN1cnJlbnRGcmFnbWVudCk7Ci0JCWludCBuZXdJbmRleCA9IGxpc3QuaW5kZXhPZihuZXdGcmFnbWVudCk7Ci0JCWlmIChvbGRJbmRleCA9PSBuZXdJbmRleCkKLQkJCXJldHVybjsKLQkJCi0JCS8vc2FmZUV4ZWN1dGVUYXNrKGN1cnJlbnRGcmFnbWVudCwgREVQQVJUVVJFKTsKLQkJaWYgKGN1cnJlbnRGcmFnbWVudCAhPSBudWxsKQotCQkJY3VycmVudEZyYWdtZW50LmV4aXQoKTsKLQkJCi0JCWlmIChvbGRJbmRleCA8IG5ld0luZGV4KQotCQkJb2xkSW5kZXggKys7Ci0JCWVsc2UKLQkJCW9sZEluZGV4IC0tOwotCQkKLQkJd2hpbGUgKG9sZEluZGV4ICE9IG5ld0luZGV4KSB7Ci0JCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgbGlzdC5nZXQob2xkSW5kZXgpOwotCQkJLy9zYWZlRXhlY3V0ZVRhc2soZnJhZ21lbnQsIEFSUklWQUwpOwotCQkJLy9zYWZlRXhlY3V0ZVRhc2soZnJhZ21lbnQsIERFUEFSVFVSRSk7Ci0JCQlmcmFnbWVudC5lbnRlcigpOwotCQkJZnJhZ21lbnQuZXhpdCgpOwotCQkJaWYgKG9sZEluZGV4IDwgbmV3SW5kZXgpCi0JCQkJb2xkSW5kZXggKys7Ci0JCQllbHNlCi0JCQkJb2xkSW5kZXggLS07Ci0JCX0KLQkJCi0JCWN1cnJlbnRGcmFnbWVudCA9IG5ld0ZyYWdtZW50OwotCQkvL3NhZmVFeGVjdXRlVGFzayhjdXJyZW50RnJhZ21lbnQsIEFSUklWQUwpOwotCQljdXJyZW50RnJhZ21lbnQuZW50ZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFdpemFyZEZyYWdtZW50PiBnZXRBbGxXaXphcmRGcmFnbWVudHMoKSB7Ci0JCUxpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOwotCQlsaXN0LmFkZChyb290RnJhZ21lbnQpOwotCQlhZGRTdWJXaXphcmRGcmFnbWVudHMocm9vdEZyYWdtZW50LCBsaXN0KTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCF0YXNrTW9kZWwuZXF1YWxzKGZyYWdtZW50LmdldFRhc2tNb2RlbCgpKSkKLQkJCQlmcmFnbWVudC5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3ViV2l6YXJkRnJhZ21lbnRzKFdpemFyZEZyYWdtZW50IGZyYWdtZW50LCBMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZnJhZ21lbnQuZ2V0Q2hpbGRGcmFnbWVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXaXphcmRGcmFnbWVudCBjaGlsZCA9IChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJYWRkU3ViV2l6YXJkRnJhZ21lbnRzKGNoaWxkLCBsaXN0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKGFkZGluZ1BhZ2VzKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCWFkZGluZ1BhZ2VzID0gdHJ1ZTsKLQkJCXBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQkJCUl0ZXJhdG9yPFdpemFyZEZyYWdtZW50PiBpdGVyYXRvciA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJVGFza1dpemFyZFBhZ2UgcGFnZSA9IGdldEZyYWdtZW50RGF0YShmcmFnbWVudCk7Ci0JCQkJaWYgKGZyYWdtZW50Lmhhc0NvbXBvc2l0ZSgpKSB7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpCi0JCQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJCQllbHNlIHsKLQkJCQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UyID0gbmV3IFRhc2tXaXphcmRQYWdlKGZyYWdtZW50KTsKLQkJCQkJCWZyYWdtZW50RGF0YS5wdXQoZnJhZ21lbnQsIHBhZ2UyKTsKLQkJCQkJCWFkZFBhZ2UocGFnZTIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIGZyYWdtZW50cyB0byB3aXphcmQiLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWFkZGluZ1BhZ2VzID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKnByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlV2l6YXJkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50LnVwZGF0ZVBhZ2VzKCk7Ci0JCQljdXJyZW50LmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHdpemFyZCBwYWdlcyIsIGUpOwotCQl9Ci0JfSovCi0KLQlwcml2YXRlIFRhc2tXaXphcmRQYWdlIGdldEZyYWdtZW50RGF0YShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgewotCQl0cnkgewotCQkJVGFza1dpemFyZFBhZ2UgcGFnZSA9IGZyYWdtZW50RGF0YS5nZXQoZnJhZ21lbnQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgZnJhZ21lbnQgZGF0YSIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJYWRkUGFnZXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBjaGVjayBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotCQlmb3IgKGludCBpPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghKHBhZ2VzLmdldChpKSkuaXNQYWdlQ29tcGxldGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY3JlYXRlIGFsbCB0aGUgcGFnZXMgY29udHJvbHMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKyl7Ci0JCQlJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aWZ5IHBhZ2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXBhZ2VzLmdldChpKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIGltYWdlCi0JCWlmIChkZWZhdWx0SW1hZ2UgIT0gbnVsbCkgewotCQkJZGVmYXVsdEltYWdlLmRpc3Bvc2UoKTsKLQkJCWRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREZWZhdWx0UGFnZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREaWFsb2dTZXR0aW5ncygpCi0JICovCi0JcHVibGljIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldE5leHRQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpbnQgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpOwotCQlpZiAoaW5kZXggPT0gcGFnZXMuc2l6ZSgpIC0gMSB8fCBpbmRleCA9PSAtMSkKLQkJCS8vIGxhc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gcGFnZXMuZ2V0KGluZGV4ICsgMSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCVN0cmluZyBwYWdlTmFtZSA9IHBhZ2UuZ2V0TmFtZSgpOwotCQkJaWYgKHBhZ2VOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQYWdlQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGFnZUNvdW50KCkgewotCQlyZXR1cm4gcGFnZXMuc2l6ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRQYWdlcygpIHsKLQkJcmV0dXJuIHBhZ2VzLnRvQXJyYXkobmV3IElXaXphcmRQYWdlW3BhZ2VzLnNpemUoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFByZXZpb3VzUGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWludCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7Ci0JCWlmIChpbmRleCA9PSAwIHx8IGluZGV4ID09IC0xKQotCQkJLy8gZmlyc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYWdlcy5nZXQoaW5kZXggLSAxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRTdGFydGluZ1BhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCWlmIChwYWdlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIHBhZ2VzLmdldCgwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRUaXRsZUJhckNvbG9yKCkKLQkgKi8KLQlwdWJsaWMgUkdCIGdldFRpdGxlQmFyQ29sb3IoKSB7Ci0JCXJldHVybiB0aXRsZUJhckNvbG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFdpbmRvd1RpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpbmRvd1RpdGxlKCkgewotCQlyZXR1cm4gd2luZG93VGl0bGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjaXNIZWxwQXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBpc0hlbHBBdmFpbGFibGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjbmVlZHNQcmV2aW91c0FuZE5leHRCdXR0b25zKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB7Ci0JCXJldHVybiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgfHwgcGFnZXMuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNuZWVkc1Byb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBuZWVkc1Byb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNzZXRDb250YWluZXIob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElXaXphcmRDb250YWluZXIgd2l6YXJkQ29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gd2l6YXJkQ29udGFpbmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaWFsb2dTZXR0aW5ncyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLQkJZGlhbG9nU2V0dGluZ3MgPSBzZXR0aW5nczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IoYm9vbGVhbiBiKSB7Ci0JCW5lZWRzUHJvZ3Jlc3NNb25pdG9yID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKGJvb2xlYW4gYikgewotCQlmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJd2luZG93VGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VKb2IoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvYlRpdGxlKCkgewotCQlyZXR1cm4gZ2V0V2luZG93VGl0bGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyYTJhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBBIHRhc2sgd2l6YXJkIHBhZ2UuCi0gKi8KLWNsYXNzIFRhc2tXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElXaXphcmRIYW5kbGUgewotCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBmcmFnbWVudDsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JcHVibGljIFRhc2tXaXphcmRQYWdlKFdpemFyZEZyYWdtZW50IGZyYWdtZW50KSB7Ci0JCXN1cGVyKGZyYWdtZW50LnRvU3RyaW5nKCkpOwotCQl0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50Q29tcCkgewotCQlDb21wb3NpdGUgY29tcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb21wID0gZnJhZ21lbnQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudENvbXAsIHRoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgd2l6YXJkIHBhZ2UgY29tcG9zaXRlIiwgZSk7Ci0JCX0KLQkJaWYgKGNvbXAgPT0gbnVsbCkgewotCQkJY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcCwgU1dULk5PTkUpOwotCQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KCJJbnRlcm5hbCBlcnJvciIpOwotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygxNTApOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0JCQotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCQl1cGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJdHJ5IHsKLQkJCWlmICghZnJhZ21lbnQuaXNDb21wbGV0ZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJaWYgKGdldE5leHRQYWdlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmICghZnJhZ21lbnQuaXNDb21wbGV0ZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkKLQkJaWYgKHZpc2libGUpIHsKLQkJCVRhc2tXaXphcmQgd2l6YXJkID0gKFRhc2tXaXphcmQpIGdldFdpemFyZCgpOwotCQkJd2l6YXJkLnN3aXRjaFdpemFyZEZyYWdtZW50KGZyYWdtZW50KTsKLQkJCQotCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gbnVsbCkKLQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SICYmICIiLmVxdWFscyhtZXNzYWdlKSkgewotCQkJbWVzc2FnZSA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuc2V0TWVzc2FnZShtZXNzYWdlLCB0eXBlKTsKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZyA9ICgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldEN1cnJlbnRXaXphcmRGcmFnbWVudCgpOwotCQlpZiAoIWZyYWdtZW50LmVxdWFscyhmcmFnKSkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS5ydW4oZm9yaywgY2FuY2VsYWJsZSwgcnVubmFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKCFpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCQotCQlmaW5hbCBJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZnJhZ21lbnQudXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKLQkJCQkoKFRhc2tXaXphcmQpIGdldFdpemFyZCgpKS51cGRhdGVQYWdlcygpOwotCQkJCQotCQkJCWlmIChjb250YWluZXIuZ2V0Q3VycmVudFBhZ2UoKSAhPSBudWxsKQotCQkJCQljb250YWluZXIudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1dpemFyZFRhc2tVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvV2l6YXJkVGFza1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3M2VkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvV2l6YXJkVGFza1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlByb2plY3RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkVGFza1V0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTEFVTkNIQUJMRV9BREFQVEVSID0gImxhdW5jaGFibGVBZGFwdGVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0xBVU5DSEFCTEUgPSAibGF1bmNoYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19DTElFTlQgPSAiY2xpZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0NMSUVOVFMgPSAiY2xpZW50cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERUZBVUxUX1NFUlZFUiA9ICJkZWZhdWx0U2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX01PREUgPSAibW9kZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19IQVNfVEFTS1MgPSAiaGFzVGFza3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfSEFTX0NMSUVOVFMgPSAiaGFzQ2xpZW50cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19GRUFUVVJFID0gImZlYXR1cmUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfRVhJU1RJTkcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0RFVEVDVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgU2F2ZVJ1bnRpbWVGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVdpemFyZFRhc2tVdGlsLnNhdmVSdW50aW1lKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdpemFyZEZyYWdtZW50IFNhdmVTZXJ2ZXJGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVdpemFyZFRhc2tVdGlsLnNhdmVTZXJ2ZXIoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgVGVtcFNhdmVSdW50aW1lRnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlXaXphcmRUYXNrVXRpbC50ZW1wU2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgVGVtcFNhdmVTZXJ2ZXJGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVdpemFyZFRhc2tVdGlsLnRlbXBTYXZlU2VydmVyKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdpemFyZEZyYWdtZW50IFNhdmVIb3N0bmFtZUZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmFkZEhvc3RuYW1lKHNlcnZlcjIuZ2V0SG9zdCgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBXaXphcmRUYXNrVXRpbCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYXZlUnVudGltZShUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJaWYgKHdvcmtpbmdDb3B5LmlzRGlydHkoKSkKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5JVGFzayNkb1Rhc2soKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYXZlU2VydmVyKFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJCWlmICh3b3JraW5nQ29weS5pc0RpcnR5KCkpIHsKLQkJCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCQkJCi0JCQkJCWlmICghZmlsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQkJCQlFY2xpcHNlVXRpbC5jcmVhdGVOZXdTZXJ2ZXJQcm9qZWN0KG51bGwsIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsLCBtb25pdG9yKTsKLQkJCQkJCi0JCQkJCVByb2plY3RQcm9wZXJ0aWVzIHBwID0gU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOwotCQkJCQlpZiAoIXBwLmlzU2VydmVyUHJvamVjdCgpKQotCQkJCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB0ZW1wU2F2ZVJ1bnRpbWUoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZTsKLQkJCWlmICghd29ya2luZ0NvcHkuaXNEaXJ0eSgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJcnVudGltZSA9IHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lLmNyZWF0ZVdvcmtpbmdDb3B5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRlbXBTYXZlU2VydmVyKFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJCWlmICghd29ya2luZ0NvcHkuaXNEaXJ0eSgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXdvcmtpbmdDb3B5KS5nZXRGaWxlKCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCQotCQkJCWlmICghZmlsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQkJCUVjbGlwc2VVdGlsLmNyZWF0ZU5ld1NlcnZlclByb2plY3QobnVsbCwgcHJvamVjdC5nZXROYW1lKCksIG51bGwsIG1vbml0b3IpOwotCQkJCQotCQkJCVByb2plY3RQcm9wZXJ0aWVzIHBwID0gU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOwotCQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlJUnVudGltZSBydW50aW1lID0gd29ya2luZ0NvcHkuZ2V0UnVudGltZSgpOwotCQkJCi0JCQlzZXJ2ZXIgPSB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKTsKLQkJCXdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkKLQkJCXdvcmtpbmdDb3B5LnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQlpZiAod29ya2luZ0NvcHkuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkKLQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXdvcmtpbmdDb3B5KS5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHdvcmtpbmdDb3B5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCUlNb2R1bGUgcGFyZW50TW9kdWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkKLQkJCQlwYXJlbnRNb2R1bGUgPSBwYXJlbnRzWzBdOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHBhcmVudCBtb2R1bGUiLCBlKTsKLQkJfQotCQkKLQkJaWYgKHBhcmVudE1vZHVsZSA9PSBudWxsKSB7Ci0JCQkvLyB1c2UgdGhlIG9yaWdpbmFsIG1vZHVsZSBzaW5jZSBubyBwYXJlbnQgbW9kdWxlIGlzIGF2YWlsYWJsZQotCQkJcGFyZW50TW9kdWxlID0gbW9kdWxlOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7Ci0JCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocGFyZW50TW9kdWxlLmVxdWFscyhtb2R1bGVzW2ldKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQl3b3JraW5nQ29weS5tb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBwYXJlbnRNb2R1bGUgfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgd29ya2luZ0NvcHkuc2F2ZShmYWxzZSwgbW9uaXRvcikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlNb2R1bGVzKExpc3Q8SU1vZHVsZT4gYWRkLCBMaXN0PElNb2R1bGU+IHJlbW92ZSwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgoYWRkID09IG51bGwgfHwgYWRkLmlzRW1wdHkoKSkgJiYgKHJlbW92ZSA9PSBudWxsIHx8IHJlbW92ZS5pc0VtcHR5KCkpKQotCQkJcmV0dXJuOwotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQkKLQkJLy8gbW9kaWZ5IG1vZHVsZXMKLQkJSU1vZHVsZVtdIHJlbW92ZTIgPSBuZXcgSU1vZHVsZVswXTsKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQlyZW1vdmUyID0gbmV3IElNb2R1bGVbcmVtb3ZlLnNpemUoKV07Ci0JCQlyZW1vdmUudG9BcnJheShyZW1vdmUyKTsKLQkJfQotCQkKLQkJSU1vZHVsZVtdIGFkZDIgPSBuZXcgSU1vZHVsZVswXTsKLQkJaWYgKGFkZCAhPSBudWxsKSB7Ci0JCQlhZGQyID0gbmV3IElNb2R1bGVbYWRkLnNpemUoKV07Ci0JCQlhZGQudG9BcnJheShhZGQyKTsKLQkJfQotCQkKLQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXdvcmtpbmdDb3B5KS5nZXRGaWxlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCQotCQkJaWYgKCFmaWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCQlFY2xpcHNlVXRpbC5jcmVhdGVOZXdTZXJ2ZXJQcm9qZWN0KG51bGwsIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsLCBtb25pdG9yKTsKLQkJCQotCQkJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCQlpZiAoIXBwLmlzU2VydmVyUHJvamVjdCgpKQotCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCXdvcmtpbmdDb3B5Lm1vZGlmeU1vZHVsZXMoYWRkMiwgcmVtb3ZlMiwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9FeHRlbnNpb25XaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0V4dGVuc2lvbldpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2RhMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0V4dGVuc2lvbldpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkV4dGVuc2lvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLkV4dGVuc2lvbjJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25XaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgRXh0ZW5zaW9uMkNvbXBvc2l0ZSBjb21wOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQotCXB1YmxpYyBFeHRlbnNpb25XaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQyKSB7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkMjsKLQkJY29tcCA9IG5ldyBFeHRlbnNpb24yQ29tcG9zaXRlKHBhcmVudCwgZ2V0VGFza01vZGVsKCksIHdpemFyZCk7Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlckRlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOwotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfRkVBVFVSRSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCQlFeHRlbnNpb25XaXphcmQudXBkYXRlTGljZW5zZSh3aXphcmQsIGdldFRhc2tNb2RlbCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0xpY2Vuc2VXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0xpY2Vuc2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTU1YjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9MaWNlbnNlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5MaWNlbnNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0UgPSAibGljZW5zZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9OT05FID0gIm5vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfVU5LTk9XTiA9ICJ1bmtub3duIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX0FDQ0VQVCA9ICJhY2NlcHQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfU0VSVkVSID0gImxpY2Vuc2Vfc2VydmVyIjsKLQotCXByb3RlY3RlZCBMaWNlbnNlQ29tcG9zaXRlIGNvbXA7Ci0KLQlwdWJsaWMgTGljZW5zZVdpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpCi0JCQljb21wLnVwZGF0ZUxpY2Vuc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgTGljZW5zZUNvbXBvc2l0ZShwYXJlbnQsIGdldFRhc2tNb2RlbCgpLCB3aXphcmQpOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpekxpY2Vuc2VUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpMaWNlbnNlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfU0VSVkVSKSk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCk7Ci0JCQlpZiAoYiAhPSBudWxsICYmIGIuYm9vbGVhblZhbHVlKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiOWUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vZHVsZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZSBjb21wOwotCi0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCi0JcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQoSU1vZHVsZSBtb2R1bGUpIHsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCQljb21wID0gbmV3IE1vZGlmeU1vZHVsZXNDb21wb3NpdGUocGFyZW50LCBoYW5kbGUsIG1vZHVsZSk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQlpZiAoY29tcCAhPSBudWxsKQotCQkJY29tcC5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJdXBkYXRlTW9kdWxlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGcmFnbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJdXBkYXRlTW9kdWxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZHVsZXMoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQljb21wLnNldFRhc2tNb2RlbChnZXRUYXNrTW9kZWwoKSk7Ci0JCQljb21wLnNldFNlcnZlcihzZXJ2ZXIpOwotCQl9IGVsc2UgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlUYXNrTW9kZWwgdGFza01vZGVsID0gZ2V0VGFza01vZGVsKCk7Ci0JCQlpZiAodGFza01vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVtdPigpOwotCQkJKChTZXJ2ZXIpIHNlcnZlcikudmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUyKSB7Ci0JCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQkJCQotCQkJLy8gYWRkIG1vZHVsZQotCQkJSU1vZHVsZSBwYXJlbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG51bGwpOwotCQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCQkKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQlsaXN0LmFkZChwYXJlbnQpOwotCQkJCX0KLQkJCQkvLyBUT0RPIC0gZ2V0IHBhcmVudCBtb2R1bGVzIGNvcnJlY3QKLQkJCQlpZiAoIW1vZHVsZUxpc3QuY29udGFpbnMobW9kdWxlKSkgewotCQkJCQltb2R1bGVMaXN0LmFkZChuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHBhcmVudCBtb2R1bGUiLCBlKTsKLQkJCX0KLQkJCQotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19NT0RVTEVTLCBtb2R1bGVMaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpCi0JCQlyZXR1cm4gY29tcC5pc0NvbXBsZXRlKCk7Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29tcCAhPSBudWxsKQotCQkJV2l6YXJkVGFza1V0aWwubW9kaWZ5TW9kdWxlcyhjb21wLmdldE1vZHVsZXNUb0FkZCgpLCBjb21wLmdldE1vZHVsZXNUb1JlbW92ZSgpLCBnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczZDFlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLk5ld1J1bnRpbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JLy8gZmlsdGVyIGJ5IHR5cGUvdmVyc2lvbgotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0KLQkvLyBmaWx0ZXIgYnkgcGFydGlhbCBydW50aW1lIHR5cGUgaWQKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+IGZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudD4oKTsKLQotCXB1YmxpYyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXJldHVybiBuZXcgTmV3UnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCwgZ2V0VGFza01vZGVsKCksIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJV2l6YXJkRnJhZ21lbnQgc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQlpZiAoc3ViICE9IG51bGwpCi0JCQlsaXN0LmFkZChzdWIpOwotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBTZXJ2ZXJXb3JraW5nQ29weSkgewotCQkJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChydW50aW1lLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiAhcnVudGltZS5nZXRMb2NhdGlvbigpLmlzRW1wdHkoKSkKLQkJCQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJCQotCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUyID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCQkJc2VydmVyMi5zZXRSdW50aW1lKHJ1bnRpbWUyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCWlmIChzdWIgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChzdWIpOwotCQkJCi0JCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gZnJhZ21lbnRNYXAuZ2V0KHR5cGVJZCk7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCh0eXBlSWQpOwotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCWZyYWdtZW50TWFwLnB1dCh0eXBlSWQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA2OTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5OZXdTZXJ2ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IFdpemFyZFRhc2tVdGlsLk1PREVfRVhJU1RJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gV2l6YXJkVGFza1V0aWwuTU9ERV9ERVRFQ1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gV2l6YXJkVGFza1V0aWwuTU9ERV9NQU5VQUw7Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJUeXBlSWQ7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+IGZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudD4oKTsKLQlwcm90ZWN0ZWQgSVBhdGggcnVudGltZUxvY2F0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBTdHJpbmcgc2VydmVyVHlwZUlkKSB7Ci0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCXRoaXMuc2VydmVyVHlwZUlkID0gc2VydmVyVHlwZUlkOwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChJTW9kdWxlIG1vZHVsZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCVN0cmluZyBsYXVuY2hNb2RlID0gKFN0cmluZykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX0xBVU5DSF9NT0RFKTsKLQkJTmV3U2VydmVyQ29tcG9zaXRlIGNvbXAgPSBudWxsOwotCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsIHx8IHNlcnZlclR5cGVJZCAhPSBudWxsKQotCQkJY29tcCA9IG5ldyBOZXdTZXJ2ZXJDb21wb3NpdGUocGFyZW50LCB3aXphcmQsIG1vZHVsZVR5cGUsIHNlcnZlclR5cGVJZCwgbGF1bmNoTW9kZSk7Ci0JCWVsc2UKLQkJCWNvbXAgPSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQlpZiAoZ2V0VGFza01vZGVsKCkgIT0gbnVsbCkKLQkJCWNvbXAuc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gZnJhZ21lbnRNYXAuZ2V0KHR5cGVJZCk7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCh0eXBlSWQpOwotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCWZyYWdtZW50TWFwLnB1dCh0eXBlSWQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlCeXRlIGIgPSAoQnl0ZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTU9ERSk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ieXRlVmFsdWUoKSA9PSBNT0RFX01BTlVBTCkgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJCVdpemFyZEZyYWdtZW50IHN1YiA9IGdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCQlpZiAoc3ViICE9IG51bGwpCi0JCQkJCWxpc3QuYWRkKHN1Yik7Ci0JCQl9Ci0JCQkKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgc2VydmVyIGluc3RhbmNlb2YgU2VydmVyV29ya2luZ0NvcHkpIHsKLQkJCQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCQkJCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCWlmIChydW50aW1lTG9jYXRpb24gPT0gbnVsbCB8fCAhcnVudGltZUxvY2F0aW9uLmVxdWFscyhydW50aW1lLmdldExvY2F0aW9uKCkpKQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCXJ1bnRpbWVMb2NhdGlvbiA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlydW50aW1lTG9jYXRpb24gPSBudWxsOwotCQkJCX0KLQkJCQlXaXphcmRGcmFnbWVudCBzdWIgPSBnZXRXaXphcmRGcmFnbWVudChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCWlmIChzdWIgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQoc3ViKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChiICE9IG51bGwgJiYgYi5ieXRlVmFsdWUoKSA9PSBNT0RFX0VYSVNUSU5HKSB7Ci0JCQkvKmlmIChjb21wICE9IG51bGwpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGNvbXAuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKLQkJCX0qLwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldFNlcnZlcigpICE9IG51bGw7IAotCX0KLQotCXByaXZhdGUgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9PcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk1MjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9PcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSBmcmFnbWVudCB1c2VkIHRvIHNlbGVjdCBhIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbmFsQ2xpZW50V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIElDbGllbnRbXSBjbGllbnRzOwotCi0JcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQlwcm90ZWN0ZWQgSVNlcnZlciBsYXN0U2VydmVyOwotCXByb3RlY3RlZCBPYmplY3QgbGFzdExhdW5jaGFibGU7Ci0KLQlwdWJsaWMgT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudChJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCAmJiBjbGllbnRzLmxlbmd0aCA+IDEpCi0JCQlsaXN0LmFkZChuZXcgU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xpZW50cygpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRSwgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UUywgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvL2lmIChsYXN0U2VydmVyID09IG51bGwpCi0JCQkvLwlyZXR1cm47Ci0JCQkKLQkJCS8vIGdldCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVyIGFuZCBtb2R1bGUgb2JqZWN0Ci0JCQlPYmplY3QgbGF1bmNoYWJsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIG9iaiA9IFNlcnZlclVJUGx1Z2luLmdldExhdW5jaGFibGVBZGFwdGVyKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgb2JqWzBdKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBvYmpbMV0pOwotCQkJCWxhdW5jaGFibGUgPSBvYmpbMV07Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRV9BREFQVEVSLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19IQVNfQ0xJRU5UUywgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IobnVsbCwgY2UuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gc3RvcCBoZXJlIGlmIHRoZSBzZXJ2ZXIgYW5kIGxhdW5jaGFibGUgaGF2ZW4ndCBjaGFuZ2VkCi0JCQlpZiAobGFzdFNlcnZlciAhPSBudWxsICYmIGxhc3RTZXJ2ZXIuZXF1YWxzKHNlcnZlcikpIHsKLQkJCQlpZiAobGFzdExhdW5jaGFibGUgPT0gbnVsbCAmJiBsYXVuY2hhYmxlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAobGFzdExhdW5jaGFibGUgIT0gbnVsbCAmJiBsYXN0TGF1bmNoYWJsZS5lcXVhbHMobGF1bmNoYWJsZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWxhc3RTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCQlsYXN0TGF1bmNoYWJsZSA9IGxhdW5jaGFibGU7Ci0JCQkKLQkJCVN0cmluZyBsYXVuY2hNb2RlID0gKFN0cmluZykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX0xBVU5DSF9NT0RFKTsKLQkJCWNsaWVudHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRDbGllbnRzKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7Ci0JCQkKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVFMsIG51bGwpOwotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQkJaWYgKGNsaWVudHMubGVuZ3RoID4gMSkgewotCQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBjbGllbnRzKTsKLQkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQl9IGVsc2UKLQkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5ULCBjbGllbnRzWzBdKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCXVwZGF0ZUNsaWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJdXBkYXRlQ2xpZW50cygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGcmFnbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlzdXBlci5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJdXBkYXRlQ2xpZW50cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1J1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmY2Y3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSBmcmFnbWVudCB1c2VkIGZvciB0aGUgUnVuIG9uIFNlcnZlciB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlcldpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgUnVuIG9uIFNlcnZlciB3aXphcmQgd2l0aCBhbGwgcGFnZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0Ci0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMubW9kdWxlQXJ0aWZhY3QgPSBtb2R1bGVBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFJ1biBvbiBTZXJ2ZXIgd2l6YXJkIHdpdGggYSBkZWZhdWx0IHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIGxhdW5jaE1vZGUKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QKLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudChJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQlsaXN0LmFkZChuZXcgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQobW9kdWxlKSk7Ci0JCQkKLQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlU2VydmVyRnJhZ21lbnQpOwotCQkJCi0JCQlsaXN0LmFkZChuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KG1vZHVsZSkpOwotCQl9Ci0JCQotCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKLQkJCi0JCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOwotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlSG9zdG5hbWVGcmFnbWVudCk7Ci0JCQotCQlsaXN0LmFkZChuZXcgT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudChtb2R1bGVBcnRpZmFjdCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdlYjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLlNlbGVjdENsaWVudENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotLyoqCi0gKiBBIGZyYWdtZW50IHVzZWQgdG8gc2VsZWN0IGEgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHVibGljIFNlbGVjdENsaWVudFdpemFyZEZyYWdtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3RDbGllbnRDb21wb3NpdGUocGFyZW50LCB3aXphcmQsIGdldFRhc2tNb2RlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQl0cnkgewotCQkJSUNsaWVudFtdIGNsaWVudHMgPSAoSUNsaWVudFtdKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTKTsKLQkJCWlmIChjbGllbnRzID09IG51bGwgfHwgY2xpZW50cy5sZW5ndGggPCAyKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlQpICE9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TdWJUYXNrc1dpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU3ViVGFza3NXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRhMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TdWJUYXNrc1dpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuVGFza3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJUYXNrc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBUYXNrc0NvbXBvc2l0ZSBjb21wOwotCi0JcHJvdGVjdGVkIExpc3QgdGFza3M7Ci0KLQlwdWJsaWMgU3ViVGFza3NXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQl1cGRhdGVUYXNrcyh0YXNrcyk7Ci0JCQotCQlpZiAoY29tcCAhPSBudWxsKQotCQkJY29tcC5jcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGFza3MoTGlzdCBuZXdUYXNrcykgewotCQl0YXNrcyA9IG5ld1Rhc2tzOwotCQlpZiAoY29tcCAhPSBudWxsKQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNvbXAgIT0gbnVsbCAmJiAhY29tcC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQljb21wLnNldFRhc2tzKHRhc2tzKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgVGFza3NDb21wb3NpdGUocGFyZW50LCB3aXphcmQpOwotCQlyZXR1cm4gY29tcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvVGFza3NXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2ZWJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvVGFza3NXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5JT3JkZXJlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQVNLU19QRVJfUEFHRSA9IDU7Ci0KLQlwdWJsaWMgY2xhc3MgVGFza0luZm8gaW1wbGVtZW50cyBJT3JkZXJlZCB7Ci0JCXB1YmxpYyBpbnQga2luZDsKLQkJcHVibGljIFN0cmluZyBpZDsKLQkJcHVibGljIFB1Ymxpc2hPcGVyYXRpb24gdGFzazI7Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICJkZWZhdWx0OiI7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQkJaWYgKGlkID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAoc2VsZWN0ZWRUYXNrTWFwLmNvbnRhaW5zS2V5KGlkKSkKLQkJCQlyZXR1cm4gKHNlbGVjdGVkVGFza01hcC5nZXQoaWQpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQotCQkJaWYgKHNlbGVjdGVkVGFza01hcC5jb250YWluc0tleShERUZBVUxUICsgaWQpKQotCQkJCXJldHVybiAoc2VsZWN0ZWRUYXNrTWFwLmdldChERUZBVUxUICsgaWQpKS5ib29sZWFuVmFsdWUoKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VsZWN0ZWQoYm9vbGVhbiBzZWwpIHsKLQkJCXNlbGVjdGVkVGFza01hcC5wdXQoREVGQVVMVCArIGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGVkKCkgewotCQkJcmV0dXJuIChzZWxlY3RlZFRhc2tNYXAuZ2V0KERFRkFVTFQgKyBpZCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWwpIHsKLQkJCXNlbGVjdGVkVGFza01hcC5wdXQoZ2V0SWQoKSwgbmV3IEJvb2xlYW4oc2VsKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCQlyZXR1cm4gdGFzazIuZ2V0T3JkZXIoKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRJZCgpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRhc2tJbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCVRhc2tJbmZvIHRpID0gKFRhc2tJbmZvKSBvYmo7Ci0JCQlpZiAoa2luZCAhPSB0aS5raW5kKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKGlkID09IG51bGwgfHwgIWlkLmVxdWFscyh0aS5pZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAodGFzazIgPT0gbnVsbCAmJiB0aS50YXNrMiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHRhc2syICE9IG51bGwgJiYgdGkudGFzazIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaWYgKHRhc2syICE9IG51bGwgJiYgdGkudGFzazIgIT0gbnVsbCkgewotCQkJCQlpZiAodGFzazIuZ2V0S2luZCgpICE9IHRpLnRhc2syLmdldEtpbmQoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKHRhc2syLmdldE9yZGVyKCkgIT0gdGkudGFzazIuZ2V0T3JkZXIoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKCF0YXNrMi5nZXRMYWJlbCgpLmVxdWFscyh0aS50YXNrMi5nZXRMYWJlbCgpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKCF0YXNrMi5nZXREZXNjcmlwdGlvbigpLmVxdWFscyh0aS50YXNrMi5nZXREZXNjcmlwdGlvbigpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCB0YXNrczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNPcHRpb25hbFRhc2tzOwotCXByb3RlY3RlZCBib29sZWFuIGhhc1ByZWZlcnJlZFRhc2tzOwotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNlbGVjdGVkVGFza01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKLQotCXB1YmxpYyBUYXNrc1dpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IHRhc2tzLnNpemUoKTsKLQkJaW50IHBhZ2VzID0gKHNpemUgLSAxKSAvIFRBU0tTX1BFUl9QQUdFICsgMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCQlTdWJUYXNrc1dpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFN1YlRhc2tzV2l6YXJkRnJhZ21lbnQoKTsKLQkJCUxpc3QgbGlzdDIgPSB0YXNrcy5zdWJMaXN0KFRBU0tTX1BFUl9QQUdFICogaSwgTWF0aC5taW4oc2l6ZSwgVEFTS1NfUEVSX1BBR0UgKiAoaSsxKSkpOwotCQkJZnJhZ21lbnQudXBkYXRlVGFza3MobGlzdDIpOwotCQkJbGlzdC5hZGQoZnJhZ21lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCXVwZGF0ZVRhc2tzKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7Ci0JCXVwZGF0ZVRhc2tzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZyYWdtZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQl1cGRhdGVUYXNrcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhc2tzKCkgewotCQlpZiAoZ2V0VGFza01vZGVsKCkgPT0gbnVsbCkgewotCQkJdGFza3MgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQlMaXN0IG1vZHVsZXMgPSAoTGlzdCkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZXMgPT0gbnVsbCkgewotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVbXT4oKTsKLQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlMikgewotCQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUyKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0JCQkKLQkJCW1vZHVsZXMgPSBtb2R1bGVMaXN0OwotCQl9Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlcyAhPSBudWxsKSB7Ci0JCQloYXNPcHRpb25hbFRhc2tzID0gZmFsc2U7Ci0JCQloYXNQcmVmZXJyZWRUYXNrcyA9IGZhbHNlOwotCQkJTGlzdDxUYXNrSW5mbz4gdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0PFRhc2tJbmZvPig1KTsKLQkJCWNyZWF0ZVRhc2tzKHRhc2tMaXN0LCBzZXJ2ZXIsIG1vZHVsZXMpOwotCQkJCi0JCQlpZiAodGFza3MgPT0gbnVsbCB8fCAhdGFza3MuZXF1YWxzKHRhc2tMaXN0KSkgewotCQkJCXRhc2tzID0gdGFza0xpc3Q7Ci0JCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKLQkJCQkKLQkJCQlib29sZWFuIGIgPSBoYXNPcHRpb25hbFRhc2tzIHx8IGhhc1ByZWZlcnJlZFRhc2tzOwotCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0hBU19UQVNLUywgbmV3IEJvb2xlYW4oYikpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhc2tzKExpc3Q8VGFza0luZm8+IHRhc2tMaXN0LCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIExpc3QgbW9kdWxlcykgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PFN0cmluZz4gZW5hYmxlZFRhc2tzID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBkaXNhYmxlZFRhc2tzID0gKChTZXJ2ZXIpc2VydmVyKS5nZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKLQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzMiA9ICgoU2VydmVyKXNlcnZlcikuZ2V0QWxsVGFza3MobW9kdWxlcyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGFza3MyLmxlbmd0aDsgaisrKSB7Ci0JCQlpbnQga2luZCA9IHRhc2tzMltqXS5nZXRLaW5kKCk7Ci0JCQlTdHJpbmcgaWQgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldFB1Ymxpc2hPcGVyYXRpb25JZCh0YXNrczJbal0pOwotCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCB8fCBraW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEKQotCQkJCWhhc09wdGlvbmFsVGFza3MgPSB0cnVlOwotCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpCi0JCQkJaGFzUHJlZmVycmVkVGFza3MgPSB0cnVlOwotCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbChnZXRUYXNrTW9kZWwoKSk7Ci0JCQkKLQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSB0cnVlOwotCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCkgewotCQkJCWlmICghZW5hYmxlZFRhc2tzLmNvbnRhaW5zKGlkKSkKLQkJCQkJc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLlBSRUZFUlJFRCkgewotCQkJCWlmIChkaXNhYmxlZFRhc2tzLmNvbnRhaW5zKGlkKSkKLQkJCQkJc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXRhc2tMaXN0LmFkZChnZXRTZXJ2ZXJUYXNrKHNlcnZlciwgdGFza3MyW2pdLCBzZWxlY3RlZCkpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhc2tJbmZvIGdldFNlcnZlclRhc2soSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyLCBQdWJsaXNoT3BlcmF0aW9uIHRhc2syLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCVRhc2tJbmZvIHN0aSA9IG5ldyBUYXNrSW5mbygpOwotCQlzdGkudGFzazIgPSB0YXNrMjsKLQkJc3RpLmtpbmQgPSB0YXNrMi5nZXRLaW5kKCk7Ci0JCXN0aS5pZCA9ICgoU2VydmVyKXNlcnZlcikuZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2syKTsKLQkJc3RpLnNldERlZmF1bHRTZWxlY3RlZChzZWxlY3RlZCk7Ci0JCQotCQlyZXR1cm4gc3RpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGFzT3B0aW9uYWxUYXNrcykKLQkJCXJldHVybjsKLQkJCi0JCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBnZXRUYXNrTW9kZWwoKTsKLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcil0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWJvb2xlYW4gY3JlYXRlZFdDID0gZmFsc2U7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQkJaWYgKHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KQotCQkJd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyOwotCQllbHNlIHsKLQkJCXdjID0gKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJY3JlYXRlZFdDID0gdHJ1ZTsKLQkJfQotCQl3Yy5yZXNldFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKCk7Ci0JCXdjLnJlc2V0T3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlUYXNrSW5mbyB0YXNrID0gKFRhc2tJbmZvKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEID09IHRhc2sua2luZCkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEID09IHRhc2sua2luZCkgewotCQkJCWlmICghdGFzay5pc1NlbGVjdGVkKCkpCi0JCQkJCXdjLmRpc2FibGVQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucyh0YXNrLnRhc2syKTsKLQkJCX0gZWxzZSBpZiAoUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCA9PSB0YXNrLmtpbmQpIHsKLQkJCQlpZiAodGFzay5pc1NlbGVjdGVkKCkpCi0JCQkJCXdjLmVuYWJsZU9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnModGFzay50YXNrMik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjcmVhdGVkV0MgJiYgd2MuaXNEaXJ0eSgpKQotCQkJd2Muc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0V4dGVuc2lvbjJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0V4dGVuc2lvbjJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2M2YwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9FeHRlbnNpb24yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5FeHRlbnNpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuRXh0ZW5zaW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogQSBjb21wb3NpdGUgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgdG8gaW5zdGFsbC4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvbjJDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByaXZhdGUgVGFza01vZGVsIHRhc2tNb2RlbDsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCXByaXZhdGUgRXh0ZW5zaW9uQ29tcG9zaXRlIGNvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCB0aGlzIGNvbXBvc2l0ZSBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5zaW9uMkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBUYXNrTW9kZWwgdGFza01vZGVsLCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UX1dJWkFSRCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjI1OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyTWVzc2FnZSk7Ci0JCQotCQljb21wID0gbmV3IEV4dGVuc2lvbkNvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgbmV3IEV4dGVuc2lvbkNvbXBvc2l0ZS5GZWF0dXJlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmZWF0dXJlU2VsZWN0ZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJCWhhbmRsZVNlbGVjdGlvbihmZWF0dXJlKTsKLQkJCX0KLQkJfSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJLypKb2Igam9iID0gbmV3IEpvYigiRG93bmxvYWRpbmcgaW5mb3JtYXRpb24iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb21wLmRlZmVycmVkSW5pdGlhbGl6ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIC0gdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCQotCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJam9iLnNjaGVkdWxlKCk7Ki8KLQkJCi0JCS8qVGhyZWFkIHQ9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcnVuQmFja2dyb3VuZCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCXQuc3RhcnQoKTsqLwotCQkvL3J1bkJhY2tncm91bmQoKTsKLQl9Ci0KLQkvKnByb3RlY3RlZCB2b2lkIHJ1bkJhY2tncm91bmQoKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJY29tcC5kZWZlcnJlZEluaXRpYWxpemUobW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQl3aXphcmQucnVuKHRydWUsIGZhbHNlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aXRoIHJ1bm5hYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0qLwotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGFza01vZGVsLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0ZFQVRVUkUsIGZlYXR1cmUpOwotCQlFeHRlbnNpb25XaXphcmQuaW52YWxpZGF0ZUxpY2Vuc2UodGFza01vZGVsKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzkzMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvRml4ZWRUYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLS8vaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpeGVkVGFibGVMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCS8vcHJpdmF0ZSBMaXN0IGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLypwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKEludGVnZXIgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ki8KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNjb21wdXRlU2l6ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGU7Ci0JCVBvaW50IHJlc3VsdCA9IHRhYmxlLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2xheW91dChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgY29tcG9zaXRlOwotCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJaW50IHdpZHRoID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMTA7Ci0JCQotCQl0YWJsZUNvbHVtbnNbMF0uc2V0V2lkdGgod2lkdGgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvSG9zdG5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwNGIxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5BdXRvQ29tcGxldGVGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5Db250cm9sRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuVGV4dENvbnRlbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0vKioKLSAqIEEgY29tcG9zaXRlIHVzZWQgdG8gc2VsZWN0IGEgaG9zdG5hbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIb3N0bmFtZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSE9TVCA9ICJsb2NhbGhvc3QiOwotCXByb3RlY3RlZCBTdHJpbmcgaG9zdDsKLQlwcm90ZWN0ZWQgSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCi0JcHJvdGVjdGVkIFRleHQgaG9zdG5hbWU7Ci0JCi0JcHVibGljIGludGVyZmFjZSBJSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhvc3RuYW1lU2VsZWN0ZWQoU3RyaW5nIGhvc3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBIb3N0bmFtZUNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBsaXN0ZW5lcjIgYSBob3N0bmFtZSBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgSG9zdG5hbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UX1dJWkFSRCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaG9zdG5hbWUpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWhvc3RuYW1lID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWhvc3RuYW1lLnNldFRleHQoTE9DQUxIT1NUKTsKLQkJZmluYWwgQ29udHJvbERlY29yYXRpb24gaG9zdG5hbWVEZWNvcmF0aW9uID0gbmV3IENvbnRyb2xEZWNvcmF0aW9uKGhvc3RuYW1lLCBTV1QuVE9QIHwgU1dULkxFQUQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlob3N0bmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaG9zdG5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaG9zdG5hbWVDaGFuZ2VkKGhvc3RuYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJRmllbGREZWNvcmF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCk7Ci0JCUZpZWxkRGVjb3JhdGlvbiBmZCA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCk7Ci0JCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXRJbWFnZShmZC5nZXRJbWFnZSgpKTsKLQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNldERlc2NyaXB0aW9uVGV4dChmZC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCWhvc3RuYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlob3N0bmFtZURlY29yYXRpb24uc2hvdygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMaXN0PFN0cmluZz4gaG9zdHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldEhvc3RuYW1lcygpOwotCQlTdHJpbmdbXSBob3N0czIgPSBob3N0cy50b0FycmF5KG5ldyBTdHJpbmdbaG9zdHMuc2l6ZSgpXSk7Ci0JCW5ldyBBdXRvQ29tcGxldGVGaWVsZChob3N0bmFtZSwgbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCBob3N0czIpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBob3N0bmFtZUNoYW5nZWQoU3RyaW5nIG5ld0hvc3QpIHsKLQkJaWYgKG5ld0hvc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChuZXdIb3N0LmVxdWFscyhob3N0KSkKLQkJCXJldHVybjsKLQotCQlob3N0ID0gbmV3SG9zdDsKLQkJbGlzdGVuZXIuaG9zdG5hbWVTZWxlY3RlZChob3N0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhvc3RuYW1lKCkgewotCQlyZXR1cm4gaG9zdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZShTdHJpbmcgbmV3SG9zdG5hbWUpIHsKLQkJaG9zdG5hbWUuc2V0VGV4dChuZXdIb3N0bmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTGljZW5zZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTGljZW5zZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTlhY2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0xpY2Vuc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LkxpY2Vuc2VXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0vKioKLSAqIEEgY29tcG9zaXRlIHVzZWQgdG8gYWNjZXB0IGEgbGljZW5zZS4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCWNsYXNzIExpY2Vuc2VMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERU5UID0gMTU7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDSU5HID0gNTsKLQkJCi0JCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlpZiAod0hpbnQgPCAyMDApCi0JCQkJd0hpbnQgPSAyMDA7Ci0JCQlpZiAoaEhpbnQgPCAzMDApCi0JCQkJaEhpbnQgPSAzMDA7Ci0JCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCVBvaW50IHAxID0gY2hpbGRyZW5bMV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLQkJCVBvaW50IHAyID0gY2hpbGRyZW5bMl0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLQkJCQotCQkJUmVjdGFuZ2xlIHIgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCi0JCQljaGlsZHJlblsyXS5zZXRCb3VuZHMoci54ICsgSU5ERU5ULCByLnkgKyByLmhlaWdodCAtIHAyLnksIHIud2lkdGggLSBJTkRFTlQsIHAyLnkpOwotCQkJY2hpbGRyZW5bMV0uc2V0Qm91bmRzKHIueCArIElOREVOVCwgci55ICsgci5oZWlnaHQgLSBwMi55IC0gcDEueSAtIFNQQUNJTkcsIHIud2lkdGggLSBJTkRFTlQsIHAxLnkpOwotCQkJY2hpbGRyZW5bMF0uc2V0Qm91bmRzKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCAtIHAxLnkgLSBwMi55IC0gU1BBQ0lORyAqIDMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCXByb3RlY3RlZCBUZXh0IGxpY2Vuc2VUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gYWNjZXB0OwotCXByb3RlY3RlZCBCdXR0b24gZGVjbGluZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRlZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBMaWNlbnNlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRhc2tNb2RlbCBhIHRhc2sgbW9kZWwKLQkgKiBAcGFyYW0gd2l6YXJkIHRoZSB3aXphcmQgdGhpcyBjb21wb3NpdGUgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIExpY2Vuc2VDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlzZXRMYXlvdXQobmV3IExpY2Vuc2VMYXlvdXQoKSk7Ci0JCQotCQlsaWNlbnNlVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotCQlsaWNlbnNlVGV4dC5zZXRCYWNrZ3JvdW5kKGxpY2Vuc2VUZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQotCQlhY2NlcHQgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCWFjY2VwdC5zZXRUZXh0KE1lc3NhZ2VzLndpekxpY2Vuc2VBY2NlcHQpOwotCQlhY2NlcHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWNjZXB0ZWQgPSBhY2NlcHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9BQ0NFUFQsIG5ldyBCb29sZWFuKGFjY2VwdGVkKSk7Ci0JCQkJd2l6YXJkLnVwZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWRlY2xpbmUgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCWRlY2xpbmUuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlRGVjbGluZSk7Ci0JCQotCQl1cGRhdGVMaWNlbnNlKCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlTGljZW5zZSgpIHsKLQkJU3RyaW5nIGxpY2Vuc2UgPSAoU3RyaW5nKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFKTsKLQkJaWYgKGxpY2Vuc2UgPT0gbnVsbCkKLQkJCWxpY2Vuc2UgPSBMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9VTktOT1dOOwotCQkKLQkJT2JqZWN0IGFjYyA9IHRhc2tNb2RlbC5nZXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfQUNDRVBUKTsKLQkJaWYgKGFjYyA9PSBudWxsKSB7Ci0JCQlhY2NlcHRlZCA9IGZhbHNlOwotCQkJYWNjZXB0LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlkZWNsaW5lLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJCi0JCWlmIChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9OT05FLmVxdWFscyhsaWNlbnNlKSkgewotCQkJbGljZW5zZVRleHQuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlTm9uZSk7Ci0JCQlhY2NlcHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZWNsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJYWNjZXB0ZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1VOS05PV04uZXF1YWxzKGxpY2Vuc2UpKSB7Ci0JCQlsaWNlbnNlVGV4dC5zZXRUZXh0KE1lc3NhZ2VzLndpekxpY2Vuc2VOb25lKTsKLQkJCWFjY2VwdC5zZXRFbmFibGVkKHRydWUpOwotCQkJZGVjbGluZS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJbGljZW5zZVRleHQuc2V0VGV4dChsaWNlbnNlKTsKLQkJCWFjY2VwdC5zZXRFbmFibGVkKHRydWUpOwotCQkJZGVjbGluZS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfQUNDRVBULCBuZXcgQm9vbGVhbihhY2NlcHRlZCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTg4OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIGFkZCBhbmQgcmVtb3ZlIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1JFRlJFU0hfTU9EVUxFUyA9ICJyZWZyZXNoLW1vZHVsZXMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBjb2xvcjsKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgZm9udDsKLQotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQotCXByb3RlY3RlZCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcnVudGltZURpcnR5OwotCXByb3RlY3RlZCBPYmplY3QgcmVmcmVzaE1vZHVsZXM7Ci0KLQlwcm90ZWN0ZWQgTWFwPENoaWxkTW9kdWxlTWFwS2V5LCBJTW9kdWxlW10+IGNoaWxkTW9kdWxlTWFwID0gbmV3IEhhc2hNYXA8Q2hpbGRNb2R1bGVNYXBLZXksIElNb2R1bGVbXT4oKTsKLQlwcm90ZWN0ZWQgTWFwPElNb2R1bGUsIElNb2R1bGVbXT4gcGFyZW50TW9kdWxlTWFwID0gbmV3IEhhc2hNYXA8SU1vZHVsZSwgSU1vZHVsZVtdPigpOwotCi0JLy8gb3JpZ2luYWwgbW9kdWxlcyBvbiB0aGUgc2VydmVyCi0JcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gb3JpZ2luYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCi0JLy8gbW9kdWxlcyBhdmFpbGFibGUgdG8gYmUgYWRkZWQgdG8gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0KLQkvLyBjdXJyZW50IG1vZHVsZXMgb24gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IGRlcGxveWVkID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgYXZhaWxhYmxlVHJlZVZpZXdlcjsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciBkZXBsb3llZFRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZCwgYWRkQWxsOwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlLCByZW1vdmVBbGw7Ci0KLQlwcm90ZWN0ZWQgVGFza01vZGVsIHRhc2tNb2RlbDsKLQotCS8vIGEgbW9kdWxlIHRoYXQgbXVzdCBiZSBrZXB0IG9uIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgSU1vZHVsZSByZXF1aXJlZE1vZHVsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gdHJ1ZTsKLQotCS8vIHRoZSBwYXJlbnQgbW9kdWxlcyBvZiB0aGUgYWJvdmUgbW9kdWxlcy4gYXQgbGVhc3Qgb25lIG9mIHRoZXNlIG1vZHVsZXMKLQkvLyBtdXN0IGJlIGtlcHQgb24gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBJTW9kdWxlW10gcmVxdWlyZWRNb2R1bGVzOwotCi0JcHJvdGVjdGVkIE1hcDxJTW9kdWxlLCBJU3RhdHVzPiBlcnJvck1hcDsKLQotCWFic3RyYWN0IGNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBwYXJlbnRFbGVtZW50OwotCQkJSU1vZHVsZVtdIHBhcmVudCA9IG1zLm1vZHVsZTsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGNoaWxkTW9kdWxlTWFwLmdldChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkocGFyZW50KSk7Ci0JCQkKLQkJCUxpc3Q8TW9kdWxlU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVTZXJ2ZXI+KCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlNb2R1bGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJCi0JCQkJCXBhcmVudE1vZHVsZU1hcC5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQkJCQotCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnQubGVuZ3RoOwotCQkJCQlJTW9kdWxlW10gbW9kdWxlMiA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyZW50LCAwLCBtb2R1bGUyLCAwLCBzaXplMik7Ci0JCQkJCW1vZHVsZTJbc2l6ZTJdID0gY2hpbGQ7Ci0JCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVTZXJ2ZXIobnVsbCwgbW9kdWxlMikpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJSU1vZHVsZVtdIGNoaWxkID0gbXMubW9kdWxlOwotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gcGFyZW50TW9kdWxlTWFwLmdldChjaGlsZCk7Ci0JCQlpZiAobW9kdWxlczIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgTW9kdWxlU2VydmVyKG51bGwsIG1vZHVsZXMyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJSU1vZHVsZVtdIHBhcmVudCA9IG1zLm1vZHVsZTsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGNoaWxkTW9kdWxlTWFwLmdldChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkocGFyZW50KSk7Ci0JCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBBdmFpbGFibGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCUxpc3Q8TW9kdWxlU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVTZXJ2ZXI+KCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbGlzdC5hZGQobmV3IE1vZHVsZVNlcnZlcihudWxsLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pKTsKLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCX0KLQotCWNsYXNzIERlcGxveWVkQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0PE1vZHVsZVNlcnZlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlU2VydmVyPigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlU2VydmVyKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSkpOwotCQkJfQotCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGtleSBlbGVtZW50IGZvciB0aGUgY2hpbGQgbW9kdWxlIG1hcAotCSAqIENoaWxkTWFwTW9kdWxlS2V5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENoaWxkTW9kdWxlTWFwS2V5IHsKLQkJcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGVUcmVlOwotCQkKLQkJcHJvdGVjdGVkIENoaWxkTW9kdWxlTWFwS2V5KElNb2R1bGUgY3VyTW9kdWxlKSB7Ci0JCQlpZiAoY3VyTW9kdWxlICE9IG51bGwpIHsKLQkJCQltb2R1bGVUcmVlID0gbmV3IElNb2R1bGVbXSB7IGN1ck1vZHVsZSB9OwotCQkJfQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgQ2hpbGRNb2R1bGVNYXBLZXkoSU1vZHVsZVtdIGN1ck1vZHVsZVRyZWUpIHsKLQkJCW1vZHVsZVRyZWUgPSBjdXJNb2R1bGVUcmVlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSB0aGlzKSAvLyBzYW1lIG9iamVjdAotCQkJCXJldHVybiB0cnVlOwotCQkJCi0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDaGlsZE1vZHVsZU1hcEtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCQotCQkJSU1vZHVsZVtdIGN1ckNvbXBhcmVNb2R1bGUgPSAoKENoaWxkTW9kdWxlTWFwS2V5KSBvYmopLm1vZHVsZVRyZWU7Ci0JCQlpZiAoY3VyQ29tcGFyZU1vZHVsZSA9PSBtb2R1bGVUcmVlKSB7Ci0JCQkJLy8gdGhlIG1vZHVsZSB0cmVlIGlzIHRoZSBzYW1lCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZVRyZWUgPT0gbnVsbCB8fCBjdXJDb21wYXJlTW9kdWxlID09IG51bGwgfHwgbW9kdWxlVHJlZS5sZW5ndGggIT0gY3VyQ29tcGFyZU1vZHVsZS5sZW5ndGgpewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY29tcGFyZSBlYWNoIG1vZHVsZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VyQ29tcGFyZU1vZHVsZS5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWN1ckNvbXBhcmVNb2R1bGVbaV0uZXF1YWxzKG1vZHVsZVRyZWVbaV0pKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQkvLyBmb3JjZSB0aGUgc2FtZSBoYXNoIGNvZGUgb24gYWxsIHRoZSBpbnN0YW5jZXMgdG8gbWFrZXMgc3VyZSB0aGUKLQkJCS8vIGVxdWFscyhPYmplY3QpIG1ldGhvZCBpcyBiZWluZyB1c2VkIGZvciBjb21wYXJpbmcgdGhlIG9iamVjdHMKLQkJCXJldHVybiAxMjM0NTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGFkZGVkCi0JICovCi0JcHVibGljIE1vZGlmeU1vZHVsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJcmVxdWlyZWRNb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6TW9kdWxlVGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TW9kdWxlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSKSk7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQlpZiAoaXNWaXNpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBzZWUgYnVnIDE4NTg3NSwgMjA1ODY5Ci0JCWlmIChyZWZyZXNoTW9kdWxlcyA9PSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRBU0tfUkVGUkVTSF9NT0RVTEVTKSAmJiBzZXJ2ZXIgPT0gdGhpcy5zZXJ2ZXIpIHsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAocnVudGltZSA9PSBzZXJ2ZXIuZ2V0UnVudGltZSgpKSB7Ci0JCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWU7Ci0JCQkJCWlmICh3Yy5pc0RpcnR5KCkgPT0gcnVudGltZURpcnR5KQotCQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCXJlZnJlc2hNb2R1bGVzID0gdGFza01vZGVsLmdldE9iamVjdChUQVNLX1JFRlJFU0hfTU9EVUxFUyk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlydW50aW1lID0gbnVsbDsKLQkJZWxzZQotCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCXJ1bnRpbWVEaXJ0eSA9IGZhbHNlOwotCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQlpZiAocnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKLQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWU7Ci0JCQkJaWYgKHdjLmlzRGlydHkoKSkKLQkJCQkJcnVudGltZURpcnR5ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJb3JpZ2luYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlkZXBsb3llZCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCi0JCWNoaWxkTW9kdWxlTWFwID0gbmV3IEhhc2hNYXA8Q2hpbGRNb2R1bGVNYXBLZXksIElNb2R1bGVbXT4oKTsKLQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiSjJFRWNhY2hlIiwgIiIgKyBNYXRoLnJhbmRvbSgpKTsKLQkJCi0JCS8vIGdldCBjdXJyZW50bHkgZGVwbG95ZWQgbW9kdWxlcwotCQlJTW9kdWxlW10gY3VycmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQlpZiAoY3VycmVudE1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjdXJyZW50TW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCW9yaWdpbmFsTW9kdWxlcy5hZGQoY3VycmVudE1vZHVsZXNbaV0pOwotCQkJCWRlcGxveWVkLmFkZChjdXJyZW50TW9kdWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGFkZCBuZXcgbW9kdWxlCi0JCXJlcXVpcmVkTW9kdWxlcyA9IG51bGw7Ci0JCWVycm9yTWFwID0gbmV3IEhhc2hNYXA8SU1vZHVsZSwgSVN0YXR1cz4oKTsKLQkJaWYgKHJlcXVpcmVkTW9kdWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMocmVxdWlyZWRNb2R1bGUsIG51bGwpOwotCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQotCQkJCQlyZXF1aXJlZE1vZHVsZXMgPSBwYXJlbnRzOwotCQkJCWVsc2UKLQkJCQkJcmVxdWlyZWRNb2R1bGVzID0gbmV3IElNb2R1bGVbXSB7IHJlcXVpcmVkTW9kdWxlIH07Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQkJLy9lcnJvck1hcC5wdXQobmV3TW9kdWxlLCBjZS5nZXRTdGF0dXMoKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkEgcG9zc2libGUgc2VydmVyIGltcGxlbWVudGF0aW9uIGVycm9yIiwgY2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWlyZWRNb2R1bGVzICE9IG51bGwgJiYgIWRlcGxveWVkLmNvbnRhaW5zKHJlcXVpcmVkTW9kdWxlc1swXSkpCi0JCQlkZXBsb3llZC5hZGQocmVxdWlyZWRNb2R1bGVzWzBdKTsKLQkJCi0JCS8vIGdldCByZW1haW5pbmcgbW9kdWxlcwotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCkpOwotCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlczJbaV07Ci0JCQkJaWYgKCFkZXBsb3llZC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG51bGwpOwotCQkJCQkJaWYgKHBhcmVudHMgIT0gbnVsbCkgewotCQkJCQkJCWludCBzaXplMiA9IHBhcmVudHMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCQlpZiAocGFyZW50c1tqXS5lcXVhbHMobW9kdWxlKSkgewotCQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwsIG51bGwpOwotCQkJCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJCQkJCQkJCWVycm9yTWFwLnB1dChtb2R1bGUsIHN0YXR1cyk7Ci0JCQkJCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQllcnJvck1hcC5wdXQobW9kdWxlLCBjZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBidWlsZCBjaGlsZCBtYXAKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IHNlcnZlci5nZXRDaGlsZE1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkJCQljaGlsZE1vZHVsZU1hcC5wdXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSksIGNoaWxkcmVuKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCWl0ZXJhdG9yID0gbW9kdWxlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IHNlcnZlci5nZXRDaGlsZE1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkJCQljaGlsZE1vZHVsZU1hcC5wdXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSksIGNoaWxkcmVuKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBjaGlsZHJlbiByZWN1cnNpdmVseSBvbmUgbGV2ZWwKLQkJLy8gcHV0IGNoaWxkIGVsZW1lbnRzIGludG8gYSBkaWZmZXJlbnQgbGlzdCB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMKLQkJSXRlcmF0b3I8Q2hpbGRNb2R1bGVNYXBLZXk+IGl0ZXJhdG9yMiA9IGNoaWxkTW9kdWxlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8Q2hpbGRNb2R1bGVNYXBLZXk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENoaWxkTW9kdWxlTWFwS2V5PigpOwotCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IyLm5leHQoKSk7Ci0JCX0KLQkJCi0JCWl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDaGlsZE1vZHVsZU1hcEtleSBrZXkgPSAoQ2hpbGRNb2R1bGVNYXBLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbjAgPSBjaGlsZE1vZHVsZU1hcC5nZXQoa2V5KTsKLQkJCWlmIChjaGlsZHJlbjAgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4wLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpbnQgc2l6ZTIgPSBrZXkubW9kdWxlVHJlZS5sZW5ndGg7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gbmV3IElNb2R1bGVbc2l6ZTIgKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShrZXkubW9kdWxlVHJlZSwgMCwgbW9kdWxlMiwgMCwgc2l6ZTIpOwotCQkJCQltb2R1bGUyW3NpemUyXSA9IGNoaWxkcmVuMFtpXTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBzZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG1vZHVsZTIsIG51bGwpOwotCQkJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKLQkJCQkJCQljaGlsZE1vZHVsZU1hcC5wdXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZTIpLCBjaGlsZHJlbik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJKMkVFY2FjaGUiLCAiIik7Ci0JCQotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gYikgewotCQlpZiAoYikgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGF2YWlsYWJsZVRyZWVWaWV3ZXIgPT0gbnVsbCB8fCBhdmFpbGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXRyeSB7IC8vIHVwZGF0ZSB0cmVlcyBpZiB3ZSBjYW4KLQkJCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJZGVwbG95ZWRUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZShiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIG1vZGVsKSB7Ci0JCXRoaXMudGFza01vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldEZvbnQoZ2V0UGFyZW50KCkuZ2V0Rm9udCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLk1PRElGWV9NT0RVTEVTX0NPTVBPU0lURSk7Ci0JCQotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKTsKLQkJRm9udERhdGFbXSBmZCA9IGdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotCQlpbnQgc2l6ZTIgPSBmZC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykKLQkJCWZkW2ldLnNldFN0eWxlKFNXVC5JVEFMSUMpOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQpOwotCQlhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZU1lc3NhZ2UpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZUF2YWlsYWJsZUxpc3QpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVEZXBsb3llZExpc3QpOwotCQkKLQkJVHJlZSBhdmFpbGFibGVUcmVlID0gbmV3IFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJYXZhaWxhYmxlVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJYXZhaWxhYmxlVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGF2YWlsYWJsZVRyZWUpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJbGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RbXSBvYmogPSBldmVudC5nZXRFbGVtZW50cygpOwotCQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQkJYXZhaWxhYmxlVHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCWVsc2UgewotCQkJCQlvYmogPSBTZXJ2ZXJVSVBsdWdpbi5hZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhvYmopOwotCQkJCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJYXZhaWxhYmxlVHJlZVZpZXdlci5yZWZyZXNoKG9ialtpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlhdmFpbGFibGVUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXZhaWxhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQlhdmFpbGFibGVUcmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlpZiAoZTEgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIgJiYgZTIgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQkJTW9kdWxlU2VydmVyIHMxID0gKE1vZHVsZVNlcnZlcikgZTE7Ci0JCQkJCU1vZHVsZVNlcnZlciBzMiA9IChNb2R1bGVTZXJ2ZXIpIGUyOwotCQkJCQlyZXR1cm4gKHMxLm1vZHVsZVtzMS5tb2R1bGUubGVuZ3RoIC0gMV0uZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIubW9kdWxlW3MyLm1vZHVsZS5sZW5ndGggLSAxXS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJfQotCQl9KTsKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRJbnB1dChST09UKTsKLQkJCi0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVUcmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJCQlpZiAoYWRkLmlzRW5hYmxlZCgpKQotCQkJCQlhZGQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIHNsb3NoIGJ1dHRvbnMKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDEyMDsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDI1OwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMjA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlhZGQgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYWRkLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQWRkKTsKLQkJYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFkZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmVtb3ZlID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZS5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZVJlbW92ZSk7Ci0JCXJlbW92ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZW1vdmUoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCQotCQlhZGRBbGwgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYWRkQWxsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQWRkQWxsKTsKLQkJYWRkQWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhZGRBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFkZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmVBbGwgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQWxsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlUmVtb3ZlQWxsKTsKLQkJcmVtb3ZlQWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlbW92ZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlUcmVlIGRlcGxveWVkVHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQlkZXBsb3llZFRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWRlcGxveWVkVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGRlcGxveWVkVHJlZSkgewotCQkJcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVHJlZUl0ZW0gJiYgY29sb3IgIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSB3aWRnZXQ7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJCQkJSU1vZHVsZSBtID0gbXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGgtMV07Ci0JCQkJCQlpZiAobS5pc0V4dGVybmFsKCkpCi0JCQkJCQkJaXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlpdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JCQkJCQlpZiAoIShzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyKSB8fCAoKElTZXJ2ZXIpc2VydmVyKS5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobXMubW9kdWxlKSAhPSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSkKLQkJCQkJCQlpdGVtLnNldEZvbnQoZm9udCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJaXRlbS5zZXRGb250KG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCQkJfQotCQl9OwotCQlsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJbGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RbXSBvYmogPSBldmVudC5nZXRFbGVtZW50cygpOwotCQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQkJZGVwbG95ZWRUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQlkZXBsb3llZFRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWRlcGxveWVkVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEZXBsb3llZENvbnRlbnRQcm92aWRlcigpKTsKLQkJZGVwbG95ZWRUcmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlpZiAoZTEgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIgJiYgZTIgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQkJTW9kdWxlU2VydmVyIHMxID0gKE1vZHVsZVNlcnZlcikgZTE7Ci0JCQkJCU1vZHVsZVNlcnZlciBzMiA9IChNb2R1bGVTZXJ2ZXIpIGUyOwotCQkJCQlyZXR1cm4gKHMxLm1vZHVsZVtzMS5tb2R1bGUubGVuZ3RoIC0gMV0uZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIubW9kdWxlW3MyLm1vZHVsZS5sZW5ndGggLSAxXS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJfQotCQl9KTsKLQkJZGVwbG95ZWRUcmVlVmlld2VyLnNldElucHV0KFJPT1QpOwotCQkKLQkJZGVwbG95ZWRUcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQkJZGVwbG95ZWRUcmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJCQlpZiAocmVtb3ZlLmlzRW5hYmxlZCgpKQotCQkJCQlyZW1vdmUoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNldEVuYWJsZW1lbnQoKTsKLQkJYXZhaWxhYmxlVHJlZS5zZXRGb2N1cygpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kdWxlU2VydmVyW10gZ2V0QXZhaWxhYmxlU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF2YWlsYWJsZVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBNb2R1bGVTZXJ2ZXJbMF07Ci0JCQkKLQkJTW9kdWxlU2VydmVyIFtdICBtc3MgPSBuZXcgTW9kdWxlU2VydmVyW3NlbC5zaXplKCldOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNlbC50b0FycmF5KCksIDAsIG1zcywgMCwgc2VsLnNpemUoKSk7Ci0JCXJldHVybiBtc3M7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZHVsZVNlcnZlcltdIGdldERlcGxveWVkU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGRlcGxveWVkVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IE1vZHVsZVNlcnZlclswXTsKLQkJCi0JCU1vZHVsZVNlcnZlciBbXSAgbXNzID0gbmV3IE1vZHVsZVNlcnZlcltzZWwuc2l6ZSgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShzZWwudG9BcnJheSgpLCAwLCBtc3MsIDAsIHNlbC5zaXplKCkpOwotCQlyZXR1cm4gbXNzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoTW9kdWxlU2VydmVyIG1zKSB7Ci0JCWlmIChtcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG1zLm1vZHVsZTsKLQkJcmV0dXJuIG1vZHVsZXMyW21vZHVsZXMyLmxlbmd0aCAtIDFdOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoTW9kdWxlU2VydmVyW10gbXMpIHsKLQkJaWYgKG1zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5sZW5ndGg7IGkrKykKLQkJCW1vZHVsZXMyW2ldID0gZ2V0TW9kdWxlKG1zW2ldKTsKLQkJCi0JCXJldHVybiBtb2R1bGVzMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KCkgewotCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkKLQkJaW50IGNvdW50ID0gMDsKLQkJaWYgKHJlcXVpcmVkTW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkvLyBjb3VudCBob3cgbWFueSBvZiByZXF1aXJlZE1vZHVsZXMgYXJlIGRlcGxveWVkCi0JCQlpbnQgc2l6ZSA9IHJlcXVpcmVkTW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChkZXBsb3llZC5jb250YWlucyhyZXF1aXJlZE1vZHVsZXNbaV0pKQotCQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0JCQotCQkvLyBnaXZlIGVycm9yIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIHJlcXVpcmVkIG1vZHVsZXMgYW5kIG5vbmUgYXJlCi0JCS8vIGFkZGVkIHRvIHRoZSBzZXJ2ZXIKLQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCAmJiByZXF1aXJlZE1vZHVsZXMubGVuZ3RoID4gMSAmJiBjb3VudCA9PSAwKSB7Ci0JCQlTdHJpbmcgcyA9ICIiOwotCQkJaW50IHNpemUgPSByZXF1aXJlZE1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXMgKz0gIiB8ICI7Ci0JCQkJcyArPSByZXF1aXJlZE1vZHVsZXNbaV0uZ2V0TmFtZSgpOwotCQkJfQotCQkJd2l6YXJkLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMud2l6TW9kdWxlUmVxdWlyZWRNb2R1bGVzLCBzKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlpc0NvbXBsZXRlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIHNlbGVjdGlvbiBzcGVjaWZpYyBtZXNzYWdlcwotCQlNb2R1bGVTZXJ2ZXJbXSBtcyA9IGdldEF2YWlsYWJsZVNlbGVjdGlvbigpOwotCQlpZiAobXMgPT0gbnVsbCB8fCAgbXMubGVuZ3RoID09IDApIHsKLQkJCWFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUobXNbaV0pOwotCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlcnJvck1hcC5nZXQobW9kdWxlKTsKLQkJCQkJCWlmIChtb2R1bGVzLmNvbnRhaW5zKG1vZHVsZSkgJiYgc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJCX0gZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCJVbmFibGUgdG8gaGFuZGxlIGVycm9yIG1hcCBmb3IgbW9kdWxlOiIgKyBtb2R1bGUpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFkZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCWFkZEFsbC5zZXRFbmFibGVkKG1vZHVsZXMuc2l6ZSgpID4gMCk7Ci0JCQotCQltcyA9IGdldERlcGxveWVkU2VsZWN0aW9uKCk7Ci0JCWlmIChtcyA9PSBudWxsIHx8ICBtcy5sZW5ndGggPT0gMCkgewotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShtc1tpXSk7Ci0JCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIGRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJLy8gcHJvdmlkZSBlcnJvciBhYm91dCByZW1vdmluZyByZXF1aXJlZCBzaW5nbGUgbW9kdWxlCi0JCQkJCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCAmJiByZXF1aXJlZE1vZHVsZXMubGVuZ3RoID09IDEgJiYKLQkJCQkJCQlyZXF1aXJlZE1vZHVsZXNbMF0uZXF1YWxzKG1vZHVsZSkpIHsKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLndpek1vZHVsZVJlcXVpcmVkTW9kdWxlLCBtb2R1bGUuZ2V0TmFtZSgpKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZW1vdmUuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCQotCQlpZiAocmVxdWlyZWRNb2R1bGVzID09IG51bGwpCi0JCQlyZW1vdmVBbGwuc2V0RW5hYmxlZChkZXBsb3llZC5zaXplKCkgPiAwKTsKLQkJZWxzZQotCQkJcmVtb3ZlQWxsLnNldEVuYWJsZWQoZGVwbG95ZWQuc2l6ZSgpID4gMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGJvb2xlYW4gYWxsKSB7Ci0JCWlmIChhbGwpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpXTsKLQkJCW1vZHVsZXMudG9BcnJheShtb2R1bGVzMik7Ci0JCQltb3ZlQWxsKG1vZHVsZXMyLCB0cnVlKTsKLQkJfSBlbHNlCi0JCQltb3ZlQWxsKGdldE1vZHVsZXMoZ2V0QXZhaWxhYmxlU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGJvb2xlYW4gYWxsKSB7Ci0JCWlmIChhbGwpIHsKLQkJCS8vIHBpY2sgb25lIG9mIHRoZSByZXF1aXJlZCBtb2R1bGVzIHRvIGtlZXAKLQkJCUlNb2R1bGUga2VlcCA9IG51bGw7Ci0JCQlpZiAocmVxdWlyZWRNb2R1bGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZTIgPSByZXF1aXJlZE1vZHVsZXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJCQlpZiAoa2VlcCA9PSBudWxsICYmIGRlcGxveWVkLmNvbnRhaW5zKHJlcXVpcmVkTW9kdWxlc1tpXSkpCi0JCQkJCQlrZWVwID0gcmVxdWlyZWRNb2R1bGVzW2ldOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQkJbGlzdC5hZGRBbGwoZGVwbG95ZWQpOwotCQkJbGlzdC5yZW1vdmUoa2VlcCk7Ci0JCQkKLQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShtb2R1bGVzMik7Ci0JCQkKLQkJCW1vdmVBbGwobW9kdWxlczIsIGZhbHNlKTsKLQkJfSBlbHNlCi0JCQltb3ZlQWxsKGdldE1vZHVsZXMoZ2V0RGVwbG95ZWRTZWxlY3Rpb24oKSksIGZhbHNlKTsKLQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUFsbChJTW9kdWxlW10gbW9kcywgYm9vbGVhbiBhZGQyKSB7Ci0JCWludCBzaXplID0gbW9kcy5sZW5ndGg7Ci0JCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZXJyb3JNYXAuZ2V0KG1vZHNbaV0pOwotCQkJCi0JCQlpZiAoc3RhdHVzID09IG51bGwgJiYgIWxpc3QuY29udGFpbnMobW9kc1tpXSkpCi0JCQkJbGlzdC5hZGQobW9kc1tpXSk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSBuZXcgTW9kdWxlU2VydmVyKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSk7Ci0JCQlpZiAoYWRkMikgewotCQkJCW1vZHVsZXMucmVtb3ZlKG1vZHVsZSk7Ci0JCQkJZGVwbG95ZWQuYWRkKG1vZHVsZSk7Ci0JCQkJYXZhaWxhYmxlVHJlZVZpZXdlci5yZW1vdmUobXMpOwotCQkJCWRlcGxveWVkVHJlZVZpZXdlci5hZGQoUk9PVCwgbXMpOwotCQkJfSBlbHNlIHsKLQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCWRlcGxveWVkLnJlbW92ZShtb2R1bGUpOwotCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIuYWRkKFJPT1QsIG1zKTsKLQkJCQlkZXBsb3llZFRyZWVWaWV3ZXIucmVtb3ZlKG1zKTsKLQkJCX0KLQkJfQotCQkKLQkJLy9hdmFpbGFibGVUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJLy9kZXBsb3llZFRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCXNldEVuYWJsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrTW9kZWwoKSB7Ci0JCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMsIGdldE1vZHVsZU1hcCgpKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldE1vZHVsZXNUb1JlbW92ZSgpIHsKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG9yaWdpbmFsTW9kdWxlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpCi0JCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJTW9kdWxlPiBnZXRNb2R1bGVzVG9BZGQoKSB7Ci0JCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIW9yaWdpbmFsTW9kdWxlcy5jb250YWlucyhtb2R1bGUpKQotCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDaGlsZE1hcChMaXN0PElNb2R1bGVbXT4gbWFwLCBJTW9kdWxlW10gcGFyZW50cywgSU1vZHVsZVtdIGNoaWxkcmVuKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IGNoaWxkcmVuW2ldOwotCQkJCi0JCQlpbnQgc2l6ZTIgPSBwYXJlbnRzLmxlbmd0aDsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmVudHMsIDAsIG1vZHVsZXMyLCAwLCBzaXplMik7Ci0JCQltb2R1bGVzMltzaXplMl0gPSBtb2R1bGU7Ci0JCQltYXAuYWRkKG1vZHVsZXMyKTsKLQkJCQotCQkJSU1vZHVsZVtdIGNoaWxkcmVuMiA9IGNoaWxkTW9kdWxlTWFwLmdldChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkobW9kdWxlKSk7Ci0JCQlpZiAoY2hpbGRyZW4yICE9IG51bGwpCi0JCQkJYWRkQ2hpbGRNYXAobWFwLCBtb2R1bGVzMiwgY2hpbGRyZW4yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZHVsZU1hcCgpIHsKLQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1hcCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVtdPigpOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlcGxveWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNb2R1bGVbXSBtb2R1bGVUcmVlID0gbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9OwotCQkJbWFwLmFkZChtb2R1bGVUcmVlKTsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGNoaWxkTW9kdWxlTWFwLmdldChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkobW9kdWxlKSk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkJCQlhZGRDaGlsZE1hcChtYXAsIG1vZHVsZVRyZWUsIGNoaWxkcmVuKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNDb21wbGV0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZGRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gZGV0ZWN0IGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByb3RlY3RlZCBCdXR0b24gZGV0ZWN0OwotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIExhYmVsIGhvc3RMYWJlbDsKLQotCXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKTsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFNlcnZlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIHNlcnZlcnMudG9BcnJheSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBTZXJ2ZXJMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyMiA9IChJU2VydmVyKSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQkJcmV0dXJuIHNlcnZlcjIuZ2V0TmFtZSgpOwotCQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gIm4vYSI7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyMikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBsaXN0ZW5lcjIgYSBzZXJ2ZXIgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIHNwYW4sIHRydWUsIGZhbHNlKTsKLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4sIGJvb2xlYW4gYWxpZ25Ub3AsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWlmIChhbGlnblRvcCkKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlpZiAoaW5kZW50KQotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQotCQljcmVhdGVIZWFkaW5nTGFiZWwodGhpcywgIlNlbGVjdCB0aGUgU2VydmVyIiwgMik7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDYwOwotCQlkYXRhLndpZHRoSGludCA9IDUwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDEwMCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoIlNlcnZlciIpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgODAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wyLnNldFRleHQoIlN0YXR1cyIpOwotCQkKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFNlcnZlckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJzdGF0dXMifSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQlTdHJpbmcgZGF0ZSA9ICI8bm93PiI7Ci0JCWhvc3RMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsICJMYXN0IGRldGVjdGVkIHNlcnZlcnMgb24gIiArIGhvc3QgKyAiIGF0ICIgKyBkYXRlICsgIjoiLCAxLCBmYWxzZSwgdHJ1ZSk7Ci0JCQotCQlkZXRlY3QgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCAiUmVmcmVzaCIpOwotCQlkZXRlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIGRldGVjdC5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EOwotCi0JCS8vIGxpc3RlbmVycwotCQlkZXRlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgbmV3U2VydmVyID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KQotCQkJCQluZXdTZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBvYmo7Ci0JCQkJCi0JCQkJaWYgKChuZXdTZXJ2ZXIgPT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCkgfHwgKG5ld1NlcnZlciAhPSBudWxsICYmICFuZXdTZXJ2ZXIuZXF1YWxzKHNlcnZlcikpKSB7Ci0JCQkJCXNlcnZlciA9IG5ld1NlcnZlcjsKLQkJCQkJbGlzdGVuZXIuc2VydmVyU2VsZWN0ZWQoc2VydmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2V0SG9zdChudWxsKTsKLQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0JCXJldHVybiBob3N0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQlpZiAoaG9zdCAhPSBudWxsKSB7Ci0JCQlob3N0TGFiZWwuc2V0VGV4dCgiRGV0ZWN0ZWQgc2VydmVycyBvbiAiICsgaG9zdCArICI6Iik7Ci0JCQlkZXRlY3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXRhYmxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlob3N0TGFiZWwuc2V0VGV4dCgiTm8gaG9zdCBzZWxlY3RlZCIpOwotCQkJZGV0ZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5YWJmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuU2VydmVyVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBXaXphcmQgcGFnZSB1c2VkIHRvIGNyZWF0ZSBhIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiBhdCB0aGUgc2FtZSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKTsKLQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZTIgewotCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKLQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOwotCX0KLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZTIgd2l6YXJkOwotCi0JcHJvdGVjdGVkIFNlcnZlclR5cGVDb21wb3NpdGUgc2VydmVyVHlwZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBydW50aW1lTGFiZWw7Ci0JcHJvdGVjdGVkIENvbWJvIHJ1bnRpbWVDb21ibzsKLQlwcm90ZWN0ZWQgTGluayBjb25maWd1cmVSdW50aW1lczsKLQlwcm90ZWN0ZWQgTGluayBhZGRSdW50aW1lOwotCXByb3RlY3RlZCBJUnVudGltZVtdIHJ1bnRpbWVzOwotCXByb3RlY3RlZCBJUnVudGltZSBuZXdSdW50aW1lOwotCi0JcHJvdGVjdGVkIFRleHQgc2VydmVyTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lOwotCXByb3RlY3RlZCBib29sZWFuIHNlcnZlck5hbWVNb2RpZmllZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZ1NlcnZlck5hbWU7Ci0JcHJvdGVjdGVkIFRvb2xCYXJNYW5hZ2VyIHNlcnZlck5hbWVUb29sQmFyOwotCi0JcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCi0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGU7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyQ3JlYXRpb25DYWNoZSBjYWNoZSA9IG5ldyBTZXJ2ZXJDcmVhdGlvbkNhY2hlKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgaW5pdGlhbAotCSAqIHJlc291cmNlIHNlbGVjdGlvbiBjb250YWlucyBleGFjdGx5IG9uZSBjb250YWluZXIgcmVzb3VyY2UgdGhlbiBpdCB3aWxsIGJlCi0JICogdXNlZCBhcyB0aGUgZGVmYXVsdCBjb250YWluZXIgcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCi0JICogQHBhcmFtIG1vZHVsZVR5cGUgYSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSBtb2R1bGUgYW4gb3B0aW9uYWwgbW9kdWxlCi0JICogQHBhcmFtIHNlcnZlclR5cGVJZCBhIHNlcnZlciB0eXBlIGlkLCBvciBudWxsCi0JICogQHBhcmFtIGluY2x1ZGVJbmNvbXBhdGlibGUgdHJ1ZSB0byBpbmNsdWRlIGluY29tcGF0aWJsZSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBzaW1pbGFyIG1vZHVsZSB0eXBlcwotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHNlcnZlciBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUyIHdpemFyZCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZSwgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCQotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5zZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlSWQ7Ci0JCXRoaXMuaW5jbHVkZUluY29tcGF0aWJsZSA9IGluY2x1ZGVJbmNvbXBhdGlibGU7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwYWdlJ3MgaW5pdGlhbCB2aXN1YWwgY29tcG9uZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQkvLyB0b3AgbGV2ZWwgZ3JvdXAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuc2V0Rm9udChnZXRQYXJlbnQoKS5nZXRGb250KCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7Ci0JCQotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlID0gbmV3IFNlcnZlclR5cGVDb21wb3NpdGUodGhpcywgbW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkLCBuZXcgU2VydmVyVHlwZUNvbXBvc2l0ZS5TZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJUeXBlU2VsZWN0ZWQoSVNlcnZlclR5cGUgdHlwZTIpIHsKLQkJCQloYW5kbGVUeXBlU2VsZWN0aW9uKHR5cGUyKTsKLQkJCQkvL1dpemFyZFV0aWwuZGVmYXVsdFNlbGVjdChwYXJlbnQsIENyZWF0ZVNlcnZlcldpemFyZFBhZ2UudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhpbmNsdWRlSW5jb21wYXRpYmxlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlcnZlclR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAoc2VydmVyVHlwZUNvbXBvc2l0ZSwgQ29udGV4dElkcy5ORVdfU0VSVkVSX1RZUEUpOwotCQkKLQkJTGFiZWwgc2VydmVyTmFtZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJc2VydmVyTmFtZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZSk7Ci0JCQotCQlzZXJ2ZXJOYW1lID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuQ0FOQ0VMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpICE9IDApCi0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VydmVyTmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkKLQkJc2VydmVyTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmdTZXJ2ZXJOYW1lKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJU3RyaW5nIG5hbWUgPSBzZXJ2ZXJOYW1lLmdldFRleHQoKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCQkJaWYgKHJ1bnRpbWUyICE9IG51bGwgJiYgcnVudGltZTIgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lMjsKLQkJCQkJCXJ3Yy5zZXROYW1lKG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzZXJ2ZXJOYW1lTW9kaWZpZWQpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQlzZXJ2ZXJOYW1lTW9kaWZpZWQgPSB0cnVlOwotCQkJCWlmIChzZXJ2ZXJOYW1lVG9vbEJhciAhPSBudWxsKQotCQkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpID09IDApIHsKLQkJCXNlcnZlck5hbWVUb29sQmFyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCQkJc2VydmVyTmFtZVRvb2xCYXIuY3JlYXRlQ29udHJvbCh0aGlzKTsKLQkJCQotCQkJSUFjdGlvbiByZXNldERlZmF1bHRBY3Rpb24gPSBuZXcgQWN0aW9uKCIiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOwotCQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQkJCXNlcnZlck5hbWVNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlpZiAoc2VydmVyTmFtZVRvb2xCYXIgIT0gbnVsbCkKLQkJCQkJCXNlcnZlck5hbWVUb29sQmFyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZURlZmF1bHQpOwotCQkJcmVzZXREZWZhdWx0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9SRVNFVF9ERUZBVUxUKSk7Ci0JCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfUkVTRVRfREVGQVVMVCkpOwotCQkJCi0JCQlzZXJ2ZXJOYW1lVG9vbEJhci5hZGQocmVzZXREZWZhdWx0QWN0aW9uKTsKLQkJCXNlcnZlck5hbWVUb29sQmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJCi0JCXJ1bnRpbWVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld1NlcnZlclJ1bnRpbWUpOwotCQkKLQkJcnVudGltZUNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkpOwotCQlydW50aW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc2V0UnVudGltZShydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFkZFJ1bnRpbWUgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0JCWFkZFJ1bnRpbWUuc2V0VGV4dCgiPGE+IiArIE1lc3NhZ2VzLmFkZFJ1bnRpbWUgKyAiPC9hPiIpOwotCQlhZGRSdW50aW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWFkZFJ1bnRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCk7Ci0JCQkJaWYgKHNob3dSdW50aW1lV2l6YXJkKHNlcnZlclR5cGUpICE9IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibyhzZXJ2ZXJUeXBlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljb25maWd1cmVSdW50aW1lcyA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKLQkJY29uZmlndXJlUnVudGltZXMuc2V0VGV4dCgiPGE+IiArIE1lc3NhZ2VzLmNvbmZpZ3VyZVJ1bnRpbWVzICsgIjwvYT4iKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQljb25maWd1cmVSdW50aW1lcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb25maWd1cmVSdW50aW1lcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoc2hvd1ByZWZlcmVuY2VQYWdlKCkpIHsKLQkJCQkJcnVudGltZSA9IG51bGw7Ci0JCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpOwotCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oc2VydmVyVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIjsKLQkJU3RyaW5nIGlkMiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnJ1bnRpbWUucHJlZmVyZW5jZVBhZ2UiOwotCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQyLCBuZXcgU3RyaW5nW10geyBpZCwgaWQyIH0sIG51bGwpOwotCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNob3dSdW50aW1lV2l6YXJkKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBudWxsOwotCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCQlpZiAoZnJhZ21lbnQyID09IG51bGwpCi0JCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKLQkJCi0JCXRyeSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWVXb3JraW5nQ29weSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHJ1bnRpbWUiLCBjZSk7Ci0JCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKLQkJfQotCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChmcmFnbWVudDIpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJfQotCQl9OwotCQlUYXNrV2l6YXJkIHdpemFyZDIgPSBuZXcgVGFza1dpemFyZChNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIGZyYWdtZW50LCB0YXNrTW9kZWwpOwotCQl3aXphcmQyLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkMik7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJaWYgKHNlcnZlclR5cGVDb21wb3NpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAoaG9zdCA9PSBudWxsKSB7Ci0JCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KHRydWUpOwotCQl9IGVsc2UgaWYgKFNvY2tldFV0aWwuaXNMb2NhbGhvc3QoaG9zdCkpCi0JCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KHRydWUpOwotCQllbHNlCi0JCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KGZhbHNlKTsKLQkJCi0JCWlmIChjaGFuZ2VkKQotCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpKTsKLQkJZWxzZSBpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zZXRIb3N0KGhvc3QpOwotCQkJaWYgKCFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKLQkJCQl1cGRhdGluZ1NlcnZlck5hbWUgPSB0cnVlOwotCQkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc2VydmVyKTsKLQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQkJdXBkYXRpbmdTZXJ2ZXJOYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGEgc2VydmVyIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRTZXJ2ZXJJbXBsKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJc2VydmVyID0gbnVsbDsKLQkJCi0JCWlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlib29sZWFuIGlzTG9jYWxob3N0ID0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChob3N0KTsKLQkJCi0JCXNlcnZlciA9IGNhY2hlLmdldENhY2hlZFNlcnZlcihzZXJ2ZXJUeXBlLCBpc0xvY2FsaG9zdCk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyLnNldEhvc3QoaG9zdCk7Ci0JCQlTZXJ2ZXJVdGlsLnNldFNlcnZlckRlZmF1bHROYW1lKHNlcnZlcik7Ci0JCQlydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCWxpc3RlbmVyLnJ1bnRpbWVTZWxlY3RlZChydW50aW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIHRyeSB0byBjcmVhdGUgcnVudGltZSBmaXJzdAotCQkJSVJ1bnRpbWUgcnVuID0gbnVsbDsKLQkJCWlmIChzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSkgewotCQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsIGlzTG9jYWxob3N0KTsKLQkJCQlydW4gPSBnZXREZWZhdWx0UnVudGltZSgpOwotCQkJfQotCQkJc2VydmVyID0gY2FjaGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIHJ1biwgaXNMb2NhbGhvc3QsIG51bGwpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQkJc2VydmVyLnNldEhvc3QoaG9zdCk7Ci0JCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOwotCQkJCQotCQkJCWlmIChzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSAmJiBzZXJ2ZXIuZ2V0UnVudGltZSgpID09IG51bGwpIHsKLQkJCQkJcnVudGltZSA9IG51bGw7Ci0JCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsIGlzTG9jYWxob3N0KTsKLQkJCQkJc2V0UnVudGltZShnZXREZWZhdWx0UnVudGltZSgpKTsKLQkJCQkJCi0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpCi0JCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcikuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7Ci0JCQkJfQotCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyKS5zZXREZWZhdWx0cyhudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIiwgY2UpOwotCQkJc2VydmVyID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJd2l6YXJkLnNldE1lc3NhZ2UoTWVzc2FnZXMud2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBQaWNrIHRoZSBmaXJzdCBub24tc3R1YiBydW50aW1lIGZpcnN0LiBPdGhlcndpc2UsIGp1c3QgcGljayB0aGUgZmlyc3QgcnVudGltZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHJ1bnRpbWUKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0RGVmYXVsdFJ1bnRpbWUoKSB7Ci0JCWlmIChydW50aW1lcyA9PSBudWxsIHx8IHJ1bnRpbWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghcnVudGltZXNbaV0uaXNTdHViKCkpCi0JCQkJCXJldHVybiBydW50aW1lc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcnVudGltZXNbMF07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUnVudGltZXMoSVNlcnZlclR5cGUgc2VydmVyVHlwZSwgYm9vbGVhbiBpc0xvY2FsaG9zdCkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJbmV3UnVudGltZSA9IG51bGw7Ci0JCQotCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJTGlzdDxJUnVudGltZT4gcnVudGltZXMyID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUnVudGltZSBydW50aW1lMiA9IHJ1bnRpbWVzW2ldOwotCQkJCWlmIChpc0xvY2FsaG9zdCB8fCAhcnVudGltZTIuaXNTdHViKCkpCi0JCQkJCXJ1bnRpbWVzMi5hZGQocnVudGltZTIpOwotCQkJfQotCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbcnVudGltZXMyLnNpemUoKV07Ci0JCQlydW50aW1lczIudG9BcnJheShydW50aW1lcyk7Ci0JCQlpZiAocnVudGltZXMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGNyZWF0ZSBhIG5ldyBydW50aW1lCi0JCXRyeSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0JCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShydW50aW1lV0MpOwotCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbMV07Ci0JCQlydW50aW1lc1swXSA9IHJ1bnRpbWVXQzsKLQkJCW5ld1J1bnRpbWUgPSBydW50aW1lV0M7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZG4ndCBjcmVhdGUgcnVudGltZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsIHx8ICFzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSB8fCBzZXJ2ZXIgPT0gbnVsbCkgewotCQkJaWYgKHJ1bnRpbWVMYWJlbCAhPSBudWxsKSB7Ci0JCQkJcnVudGltZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nWzBdKTsKLQkJCQlydW50aW1lQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcnVudGltZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCXJ1bnRpbWVDb21iby5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQljb25maWd1cmVSdW50aW1lcy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQljb25maWd1cmVSdW50aW1lcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlhZGRSdW50aW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWFkZFJ1bnRpbWUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVswXTsKLQkJCXNldFJ1bnRpbWUobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KHNlcnZlci5nZXRIb3N0KCkpKTsKLQkJCi0JCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKG5ld1J1bnRpbWUpKQotCQkJCWl0ZW1zW2ldID0gTWVzc2FnZXMud2l6TmV3U2VydmVyUnVudGltZUNyZWF0ZTsKLQkJCWVsc2UKLQkJCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXNldFJ1bnRpbWUoZ2V0RGVmYXVsdFJ1bnRpbWUoKSk7Ci0JCQotCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCQlpZiAocnVudGltZXMubGVuZ3RoID4gMCkgewotCQkJCWludCBzZWwgPSAtMTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJc2VsID0gaTsKLQkJCQl9Ci0JCQkJaWYgKHNlbCA8IDApIHsKLQkJCQkJc2VsID0gMDsKLQkJCQkJc2V0UnVudGltZShydW50aW1lc1swXSk7Ci0JCQkJfQotCQkJCQotCQkJCXJ1bnRpbWVDb21iby5zZWxlY3Qoc2VsKTsKLQkJCX0KLQkJCQotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJYm9vbGVhbiBzaG93UnVudGltZSA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKS5sZW5ndGggPj0xOwotCQkJcnVudGltZUNvbWJvLnNldEVuYWJsZWQoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUxhYmVsLnNldEVuYWJsZWQoc2hvd1J1bnRpbWUpOwotCQkJY29uZmlndXJlUnVudGltZXMuc2V0RW5hYmxlZChzaG93UnVudGltZSk7Ci0JCQlhZGRSdW50aW1lLnNldEVuYWJsZWQoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUxhYmVsLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUNvbWJvLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQkJY29uZmlndXJlUnVudGltZXMuc2V0VmlzaWJsZShzaG93UnVudGltZSk7Ci0JCQlhZGRSdW50aW1lLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UnVudGltZShJUnVudGltZSBydW50aW1lMikgewotCQlydW50aW1lID0gcnVudGltZTI7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQlTZXJ2ZXJVdGlsLnNldFNlcnZlckRlZmF1bHROYW1lKHNlcnZlcik7Ci0JCX0KLQkJbGlzdGVuZXIucnVudGltZVNlbGVjdGVkKHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc2VydmVyIHR5cGUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVTZWxlY3Rpb24oSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlib29sZWFuIHdyb25nID0gZmFsc2U7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgbW9kdWxlVHlwZSAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZSkpIHsKLQkJCQlzZXJ2ZXJUeXBlID0gbnVsbDsKLQkJCQl3cm9uZyA9IHRydWU7Ci0JCQkJLy93aXphcmQuc2V0TWVzc2FnZSgiTm90IHRoZSByaWdodCBzcGVjIGxldmVsMiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAod3JvbmcpIHsKLQkJCXNlcnZlciA9IG51bGw7Ci0JCQlydW50aW1lID0gbnVsbDsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yVmVyc2lvbkxldmVsLCBuZXcgT2JqZWN0W10geyBtb2R1bGVUeXBlLmdldE5hbWUoKSwgbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCkgfSksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQl9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkgewotCQkJc2VydmVyID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJbG9hZFNlcnZlckltcGwoc2VydmVyVHlwZSk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlICE9IG51bGwpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IE5ld1NlcnZlckNvbXBvc2l0ZS5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXIsIG1vZHVsZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCAmJiAhc2VydmVyTmFtZU1vZGlmaWVkKSB7Ci0JCQl1cGRhdGluZ1NlcnZlck5hbWUgPSB0cnVlOwotCQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJCXNlcnZlck5hbWUuc2V0VGV4dCgiIik7Ci0JCQllbHNlCi0JCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJdXBkYXRpbmdTZXJ2ZXJOYW1lID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXVwZGF0ZVJ1bnRpbWVDb21ibyhzZXJ2ZXJUeXBlKTsKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCkgewotCQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQkJc2VydmVyTmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJc2VydmVyTmFtZVRvb2xCYXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXJ2ZXJOYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCXNlcnZlck5hbWVUb29sQmFyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKHNlcnZlck5hbWVNb2RpZmllZCk7Ci0JCQl9Ci0JCX0KLQkJbGlzdGVuZXIuc2VydmVyU2VsZWN0ZWQoc2VydmVyKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCi0JCWlmICh2aXNpYmxlKSB7Ci0JCQkvKmlmIChkZWZhdWx0U2VydmVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBkZWZhdWx0U2VydmVyRmFjdG9yeSB9KTsKLQkJCQl0cmVlLnNob3dJdGVtKHRyZWUuZ2V0SXRlbXMoKVswXSk7Ci0JCQl9Ki8KLQkJCS8vIGZvcmNlIHRoZSBmb2N1cyB0byBpbml0aWFsbHkgdmFsaWRhdGUgdGhlIGZpZWxkcwotCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihudWxsKTsKLQkJfQotCQkKLQkJQ29udHJvbFtdIGMgPSBnZXRDaGlsZHJlbigpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJaWYgKGNbaV0gIT0gbnVsbCAmJiBjW2ldIGluc3RhbmNlb2YgU2VydmVyVHlwZUNvbXBvc2l0ZSkKLQkJCQkJY1tpXS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmICh2aXNpYmxlKQotCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1J1bnRpbWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1J1bnRpbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxZGQ5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdSdW50aW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuUnVudGltZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld1J1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBUcmVlIHRyZWU7Ci0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVNlcnZlcjsKLQotCXByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWU7Ci0KLQkvLyBjYWNoZSBvZiBjcmVhdGVkIHJ1bnRpbWVzIGFuZCBzZXJ2ZXJzCi0JcHJvdGVjdGVkIE1hcDxJUnVudGltZVR5cGUsIElSdW50aW1lV29ya2luZ0NvcHk+IGNhY2hlID0gbmV3IEhhc2hNYXA8SVJ1bnRpbWVUeXBlLCBJUnVudGltZVdvcmtpbmdDb3B5PigpOwotCXByb3RlY3RlZCBNYXA8SVJ1bnRpbWUsIElTZXJ2ZXJXb3JraW5nQ29weT4gc2VydmVyQ2FjaGUgPSBuZXcgSGFzaE1hcDxJUnVudGltZSwgSVNlcnZlcldvcmtpbmdDb3B5PigpOwotCi0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7Ci0KLQlwdWJsaWMgTmV3UnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgVGFza01vZGVsIHRtLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXRoaXMudGFza01vZGVsID0gdG07Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMucnVudGltZVR5cGVJZCA9IHJ1bnRpbWVUeXBlSWQ7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6TmV3UnVudGltZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX05FV19SVU5USU1FKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQkvL2luaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLk5FV19SVU5USU1FX1dJWkFSRCk7Ci0JCQotCQlmaW5hbCBSdW50aW1lVHlwZUNvbXBvc2l0ZSBjb21wID0gbmV3IFJ1bnRpbWVUeXBlQ29tcG9zaXRlKHRoaXMsIHRydWUsIG5ldyBSdW50aW1lVHlwZUNvbXBvc2l0ZS5SdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcnVudGltZVR5cGVTZWxlY3RlZChJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24ocnVudGltZVR5cGUpOwotCQkJfQotCQl9LCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZVNlcnZlciA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJY3JlYXRlU2VydmVyLnNldFRleHQoTWVzc2FnZXMud2l6TmV3UnVudGltZUNyZWF0ZVNlcnZlcik7Ci0JCWNyZWF0ZVNlcnZlci5zZXRTZWxlY3Rpb24oU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRDcmVhdGVTZXJ2ZXJXaXRoUnVudGltZSgpKTsKLQkJY3JlYXRlU2VydmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlcnZlcigpOwotCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoY3JlYXRlU2VydmVyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlpZiAocnVudGltZVR5cGUgPT0gbnVsbCkKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJcnVudGltZSA9IG51bGw7Ci0JCQkJcnVudGltZSA9IGNhY2hlLmdldChydW50aW1lVHlwZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJ1bnRpbWUgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotCQkJCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShydW50aW1lKTsKLQkJCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLQkJCQkJCWNhY2hlLnB1dChydW50aW1lVHlwZSwgcnVudGltZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNlcnZlclR5cGUgPSBnZXRDb21wYXRpYmxlU2VydmVyVHlwZShydW50aW1lVHlwZSk7Ci0JCWhhbmRsZVNlcnZlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlcigpIHsKLQkJYm9vbGVhbiBvcHRpb24gPSBmYWxzZTsKLQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCAmJiBzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSkKLQkJCW9wdGlvbiA9IHRydWU7Ci0JCWNyZWF0ZVNlcnZlci5zZXRWaXNpYmxlKG9wdGlvbik7Ci0JCQotCQlpZiAob3B0aW9uICYmIGNyZWF0ZVNlcnZlci5nZXRTZWxlY3Rpb24oKSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOwotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCX0gZWxzZQotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIG51bGwpOwotCQkKLQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlclR5cGUgZ2V0Q29tcGF0aWJsZVNlcnZlclR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCUxpc3Q8SVNlcnZlclR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJUeXBlPigpOwotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlSdW50aW1lVHlwZSBydCA9IHNlcnZlclR5cGVzW2ldLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnQgIT0gbnVsbCAmJiBydC5lcXVhbHMocnVudGltZVR5cGUpKQotCQkJCWxpc3QuYWRkKHNlcnZlclR5cGVzW2ldKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPT0gMSkKLQkJCXJldHVybiBsaXN0LmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgc2VydmVyIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsIHx8IHJ1bnRpbWUgPT0gbnVsbCB8fCAhc2VydmVyVHlwZS5oYXNSdW50aW1lKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBzZXJ2ZXJDYWNoZS5nZXQocnVudGltZSk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXI7Ci0JCQotCQl0cnkgewotCQkJc2VydmVyID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIobnVsbCwgbnVsbCwgcnVudGltZSwgbnVsbCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlzZXJ2ZXIuc2V0SG9zdCgibG9jYWxob3N0Iik7Ci0JCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOwotCQkJCXNlcnZlckNhY2hlLnB1dChydW50aW1lLCBzZXJ2ZXIpOwotCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciIsIGNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlDb250cm9sW10gYyA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAoY1tpXSAhPSBudWxsKQotCQkJCQljW2ldLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3U2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxYjRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlNlcnZlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTmV3U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IFdpemFyZFRhc2tVdGlsLk1PREVfRVhJU1RJTkc7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gV2l6YXJkVGFza1V0aWwuTU9ERV9ERVRFQ1Q7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gV2l6YXJkVGFza1V0aWwuTU9ERV9NQU5VQUw7Ci0JcHJvdGVjdGVkIGJ5dGUgbW9kZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZGV0ZWN0Q29tcDI7Ci0JcHJvdGVjdGVkIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBkZXRlY3RDb21wOwotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBkZXRlY3RIb3N0Q29tcDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG1hbnVhbENvbXAyOwotCXByb3RlY3RlZCBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUgbWFudWFsQ29tcDsKLQlwcm90ZWN0ZWQgSG9zdG5hbWVDb21wb3NpdGUgbWFudWFsSG9zdENvbXA7Ci0JcHJvdGVjdGVkIFNlcnZlckNvbXBvc2l0ZSBleGlzdGluZ0NvbXA7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0YWNrOwotCXByb3RlY3RlZCBTdGFja0xheW91dCBzdGFja0xheW91dDsgCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhc3RIb3N0bmFtZTsKLQotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZXhpc3RpbmdXQzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUsIG9yIG51bGwKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHR5cGUgaWQsIG9yIG51bGwKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIGxhdW5jaCBtb2RlCi0JICovCi0JcHVibGljIE5ld1NlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdTZXJ2ZXJUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX05FV19TRVJWRVIpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZCBoYW5kbGUKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBsYXVuY2ggbW9kZQotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1NlcnZlclRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld1NlcnZlckRlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0MiwgaW50IHNwYW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRleHQuc2V0VGV4dCh0ZXh0Mik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7Ci0JCQotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKLQkJCWVsc2UKLQkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSk7Ci0JCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbik7Ci0JCQljcmVhdGVMYWJlbCh0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJTZWxlY3QsIDEpOwotCQl9Ci0JCQotCQlCdXR0b24gZXhpc3RpbmcgPSBudWxsOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWZpbmFsIEJ1dHRvbiBwcmVkZWZpbmVkID0gY3JlYXRlUmFkaW9CdXR0b24odGhpcywgTWVzc2FnZXMud2l6TmV3U2VydmVyRXhpc3RpbmcsIDEpOwotCQkJcHJlZGVmaW5lZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChwcmVkZWZpbmVkLmdldFNlbGVjdGlvbigpKQotCQkJCQkJdG9nZ2xlTW9kZShNT0RFX0VYSVNUSU5HKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWV4aXN0aW5nID0gcHJlZGVmaW5lZDsKLQkJfQotCQkKLQkJLypmaW5hbCBCdXR0b24gYXV0byA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLndpek5ld1NlcnZlckRldGVjdCIpLCAxKTsKLQkJYXV0by5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYXV0by5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoYXV0by5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJdG9nZ2xlTW9kZShNT0RFX0RFVEVDVCk7Ci0JCQl9Ci0JCX0pOyovCi0JCi0JCUJ1dHRvbiBtYW51YWwgPSBudWxsOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWZpbmFsIEJ1dHRvbiBtYW51YWxCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJNYW51YWwsIDEpOwotCQkJbWFudWFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKG1hbnVhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXRvZ2dsZU1vZGUoTU9ERV9NQU5VQUwpOwotCQkJCX0KLQkJCX0pOwotCQkJbWFudWFsID0gbWFudWFsQnV0dG9uOwotCQl9Ci0JCQotCQlzdGFjayA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXN0YWNrLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc3RhY2suc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCWNyZWF0ZUV4aXN0aW5nQ29tcG9zaXRlKHN0YWNrKTsKLQkJY3JlYXRlQXV0b0NvbXBvc2l0ZShzdGFjayk7Ci0JCWNyZWF0ZU1hbnVhbENvbXBvc2l0ZShzdGFjayk7Ci0JCQotCQlpZiAoZXhpc3RpbmdDb21wICE9IG51bGwgJiYgZXhpc3RpbmcgIT0gbnVsbCkgewotCQkJaWYgKGlzRXhpc3RpbmdTZXJ2ZXIoKSkgewotCQkJCW1vZGUgPSBNT0RFX0VYSVNUSU5HOwotCQkJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBleGlzdGluZ0NvbXA7Ci0JCQkJZXhpc3Rpbmcuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlID0gTU9ERV9NQU5VQUw7Ci0JCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJCW1hbnVhbENvbXAuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQlpZiAobWFudWFsICE9IG51bGwpCi0JCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJZXhpc3Rpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZXhpc3RpbmdDb21wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kZSA9IE1PREVfTUFOVUFMOwotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQkJaWYgKG1hbnVhbCAhPSBudWxsKQotCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJLy8gcHJlZmVycmVkIHNlcnZlciBidXR0b24KLQkJCWZpbmFsIEJ1dHRvbiBwcmVmID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0sgfCBTV1QuV1JBUCk7Ci0JCQlwcmVmLnNldFRleHQoTWVzc2FnZXMud2l6U2VsZWN0U2VydmVyUHJlZmVycmVkKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLQkJCXByZWYuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXByZWYuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfREVGQVVMVF9TRVJWRVIsIG5ldyBCb29sZWFuKHByZWYuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZiwgQ29udGV4dElkcy5TRUxFQ1RfU0VSVkVSX1BSRUZFUkVOQ0UpOwotCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZU1vZGUoYnl0ZSBuZXdNb2RlKSB7Ci0JCWlmICghaXNWaXNpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobmV3TW9kZSA9PSBtb2RlKQotCQkJcmV0dXJuOwotCQkKLQkJbW9kZSA9IG5ld01vZGU7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKSB7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZXhpc3RpbmdDb21wOwotCQkJZXhpc3RpbmdDb21wLnNldFNlbGVjdGlvbihleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKSk7Ci0JCX0gZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGRldGVjdENvbXAyOwotCQkJZGV0ZWN0Q29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9IGVsc2UgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JCXN0YWNrLmxheW91dCgpOwotCQlpZiAodGFza01vZGVsICE9IG51bGwpIHsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19NT0RFLCBuZXcgQnl0ZShtb2RlKSk7Ci0JCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBjcmVhdGVIb3N0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCUhvc3RuYW1lQ29tcG9zaXRlIGhvc3RDb21wID0gbmV3IEhvc3RuYW1lQ29tcG9zaXRlKGNvbXAsIG5ldyBIb3N0bmFtZUNvbXBvc2l0ZS5JSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhvc3RuYW1lU2VsZWN0ZWQoU3RyaW5nIGhvc3QpIHsKLQkJCQlsYXN0SG9zdG5hbWUgPSBob3N0OwotCQkJCWlmIChkZXRlY3RDb21wICE9IG51bGwpCi0JCQkJCWRldGVjdENvbXAuc2V0SG9zdChob3N0KTsKLQkJCQlpZiAobWFudWFsQ29tcCAhPSBudWxsKQotCQkJCQltYW51YWxDb21wLnNldEhvc3QoaG9zdCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGxhc3RIb3N0bmFtZSAhPSBudWxsKQotCQkJaG9zdENvbXAuc2V0SG9zdG5hbWUobGFzdEhvc3RuYW1lKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWhvc3RDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBob3N0Q29tcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRvQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCWRldGVjdENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkZXRlY3RDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWRldGVjdEhvc3RDb21wID0gY3JlYXRlSG9zdENvbXBvc2l0ZShkZXRlY3RDb21wMik7Ci0JCQotCQlkZXRlY3RDb21wID0gbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZShkZXRlY3RDb21wMiwgbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS5JU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJTZWxlY3RlZChJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCi0JCWlmIChsYXN0SG9zdG5hbWUgIT0gbnVsbCkKLQkJCWRldGVjdENvbXAuc2V0SG9zdChsYXN0SG9zdG5hbWUpOwotCQllbHNlCi0JCQlkZXRlY3RDb21wLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQlkZXRlY3RDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXhpc3RpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKLQkJZXhpc3RpbmdDb21wID0gbmV3IFNlcnZlckNvbXBvc2l0ZShjb21wLCBuZXcgU2VydmVyQ29tcG9zaXRlLlNlcnZlclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJCQotCQkJCS8vIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLCBtb2R1bGUpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChleGlzdGluZ1dDICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5lcXVhbHMoZXhpc3RpbmdXQy5nZXRPcmlnaW5hbCgpKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJZXhpc3RpbmdXQyA9IG51bGw7Ci0JCQkJfQotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJZXhpc3RpbmdXQyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOwotCQkJfQotCQl9LCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQlleGlzdGluZ0NvbXAuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQlleGlzdGluZ0NvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2Ygd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMgcmVwcmVzZW50aW5nIHRoZSBlcnJvciBvciB3YXJuaW5nLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBpc1N1cHBvcnRlZE1vZHVsZShJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10KSkgewotCQkJCVN0cmluZyB0eXBlID0gbXQuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JWZXJzaW9uTGV2ZWwsIG5ldyBPYmplY3RbXSB7IHR5cGUsIG10LmdldFZlcnNpb24oKSB9KSk7Ci0JCQl9Ci0JCQkKLQkJCUlNb2R1bGVbXSByb290TW9kdWxlcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJvb3RNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKLQkJCX0KLQkJCWlmIChyb290TW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKHJvb3RNb2R1bGVzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yUm9vdE1vZHVsZSk7Ci0JCQkJCi0JCQkJaW50IHNpemUgPSByb290TW9kdWxlcy5sZW5ndGg7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCQkJCXN0YXR1cyA9IHNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10ge3Jvb3RNb2R1bGVzW2ldfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kICYmIHN0YXR1cyAhPSBudWxsKQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBsYXVuY2hNb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpICYmCi0JCQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFudWFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCW1hbnVhbENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQltYW51YWxDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbWFudWFsQ29tcDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQltYW51YWxIb3N0Q29tcCA9IGNyZWF0ZUhvc3RDb21wb3NpdGUobWFudWFsQ29tcDIpOwotCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZVR5cGU7Ci0JCWJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZSA9IHRydWU7Ci0JCWlmIChtb2R1bGVUeXBlICE9IG51bGwpCi0JCQlpbmNsdWRlSW5jb21wYXRpYmxlID0gZmFsc2U7Ci0JCQotCQlpZiAobW9kdWxlICE9IG51bGwpCi0JCQltdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQotCQltYW51YWxDb21wID0gbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZShtYW51YWxDb21wMiwgbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5JV2l6YXJkSGFuZGxlMigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXdpemFyZC5ydW4oZm9yaywgY2FuY2VsYWJsZSwgcnVubmFibGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJCXdpemFyZC51cGRhdGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCQkJd2l6YXJkLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JCQl9Ci0JCX0sIG10LCBtb2R1bGUsIHNlcnZlclR5cGVJZCwgaW5jbHVkZUluY29tcGF0aWJsZSwgbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5TZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpZiAobGFzdEhvc3RuYW1lICE9IG51bGwpCi0JCQltYW51YWxDb21wLnNldEhvc3QobGFzdEhvc3RuYW1lKTsKLQkJZWxzZQotCQkJbWFudWFsQ29tcC5zZXRIb3N0KCJsb2NhbGhvc3QiKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSAzMjU7Ci0JCW1hbnVhbENvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrTW9kZWwoKSB7Ci0JCWlmICh0YXNrTW9kZWwgIT0gbnVsbCkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIG51bGwpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgbW9kZWwpIHsKLQkJdGFza01vZGVsID0gbW9kZWw7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19NT0RFLCBuZXcgQnl0ZShtb2RlKSk7Ci0JCXVwZGF0ZVRhc2tNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKQotCQkJcmV0dXJuIGV4aXN0aW5nV0M7IC8vZXhpc3RpbmdDb21wLmdldFNlbGVjdGVkU2VydmVyKCk7Ci0JCWVsc2UgaWYgKG1vZGUgPT0gTU9ERV9ERVRFQ1QpCi0JCQlyZXR1cm4gZGV0ZWN0Q29tcC5nZXRTZXJ2ZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG1hbnVhbENvbXAuZ2V0U2VydmVyKCk7Ci0JfQotCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7Ci0JCWlmIChtb2RlID09IE1PREVfRVhJU1RJTkcpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gZXhpc3RpbmdDb21wLmdldFNlbGVjdGVkU2VydmVyKCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChtb2RlID09IE1PREVfREVURUNUKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiBtYW51YWxDb21wLmdldFJ1bnRpbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkKLQkJQ29udHJvbFtdIGMgPSBnZXRDaGlsZHJlbigpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJaWYgKGNbaV0gIT0gbnVsbCkKLQkJCQkJY1tpXS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlbGVjdENsaWVudENvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VsZWN0Q2xpZW50Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODI4ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VsZWN0Q2xpZW50Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENsaWVudENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCi0JLy8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gc2VsZWN0IGZyb20KLQlwcm90ZWN0ZWQgSUNsaWVudFtdIGNsaWVudHM7Ci0KLQkvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQKLQlwcm90ZWN0ZWQgSUNsaWVudCBzZWxlY3RlZENsaWVudDsKLQotCS8vIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBlbGVtZW50cwotCXByb3RlY3RlZCBUYWJsZSBlbGVtZW50VGFibGU7Ci0KLQkvLyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlbGVjdGVkIGNsaWVudAotCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBTZWxlY3RDbGllbnRDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQotCSAqIEBwYXJhbSB0YXNrTW9kZWwgYSB0YXNrIG1vZGVsCi0JICovCi0JcHVibGljIFNlbGVjdENsaWVudENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCQl0cnkgewotCQkJY2xpZW50cyA9IChJQ2xpZW50W10pIHRhc2tNb2RlbC5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpTZWxlY3RDbGllbnRUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpTZWxlY3RDbGllbnREZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX1NFTEVDVF9TRVJWRVJfQ0xJRU5UKSk7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCi0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlRfV0laQVJEKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpelNlbGVjdENsaWVudE1lc3NhZ2UpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWVsZW1lbnRUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWVsZW1lbnRUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllbGVtZW50VGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdGlvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24oKTsKLQkJCQkvL1RPRE86IFdpemFyZFV0aWwuZGVmYXVsdFNlbGVjdChnZXRXaXphcmQoKSwgU2VsZWN0Q2xpZW50V2l6YXJkUGFnZS50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGVsZW1lbnRUYWJsZSwgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UKTsKLQkKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCkgewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpbnQgc2l6ZSA9IGNsaWVudHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oZWxlbWVudFRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDAsIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChjbGllbnRzW2ldKSk7Ci0JCQkJaXRlbS5zZXRJbWFnZSgwLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNsaWVudHNbaV0pKTsKLQkJCQlpdGVtLnNldERhdGEoY2xpZW50c1tpXSk7Ci0JCQl9Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA3MDsKLQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNlbGVjdGlvbiBvZiBhIGNsaWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oKSB7Ci0JCWludCBpbmRleCA9IGVsZW1lbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJc2VsZWN0ZWRDbGllbnQgPSBudWxsOwotCQllbHNlCi0JCQlzZWxlY3RlZENsaWVudCA9IGNsaWVudHNbaW5kZXhdOwotCQkKLQkJdGFza01vZGVsLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVCwgc2VsZWN0ZWRDbGllbnQpOwotCQlpZiAoc2VsZWN0ZWRDbGllbnQgIT0gbnVsbCkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCWVsc2UKLQkJCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCi0JCVN0cmluZyBkZXNjID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkQ2xpZW50ICE9IG51bGwpCi0JCQlkZXNjID0gc2VsZWN0ZWRDbGllbnQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2MgPT0gbnVsbCkKLQkJCWRlc2MgPSAiIjsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKLQkJCi0JCXdpemFyZC51cGRhdGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VydmVyQ3JlYXRpb25DYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VydmVyQ3JlYXRpb25DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBlMzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlcnZlckNyZWF0aW9uQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB1c2VkIHRvIGNhY2hlIHRoZSBjcmVhdGlvbiBvZiBzZXJ2ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyQ3JlYXRpb25DYWNoZSB7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElTZXJ2ZXJXb3JraW5nQ29weT4gY2FjaGU7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDcmVhdGlvbkNhY2hlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckNyZWF0aW9uQ2FjaGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJU2VydmVyV29ya2luZ0NvcHk+KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXkgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUgdGhlIHNlcnZlciB0eXBlCi0JICogQHBhcmFtIGlzTG9jYWxob3N0IHRydWUgaWYgdGhlIHNlcnZlciBpcyBsb2NhbAotCSAqIEByZXR1cm4gdGhlIGtleQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEtleShJU2VydmVyVHlwZSB0eXBlLCBib29sZWFuIGlzTG9jYWxob3N0KSB7Ci0JCXJldHVybiB0eXBlLmdldElkKCkgKyAifCIgKyBpc0xvY2FsaG9zdCArICJ8IjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGFuZCBwdXQgaXQgaW4gdGhlIGNhY2hlLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHNlcnZlciB0eXBlCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lLCBvciBudWxsCi0JICogQHBhcmFtIGlzTG9jYWxob3N0IHRydWUgaWYgdGhlIHNlcnZlciBpcyBsb2NhbAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBzZXJ2ZXIgd29ya2luZyBjb3B5Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihJU2VydmVyVHlwZSB0eXBlLCBJUnVudGltZSBydW50aW1lLCBib29sZWFuIGlzTG9jYWxob3N0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IHR5cGUuY3JlYXRlU2VydmVyKG51bGwsIG51bGwsIHJ1bnRpbWUsIG1vbml0b3IpOwotCQljYWNoZS5wdXQoZ2V0S2V5KHR5cGUsIGlzTG9jYWxob3N0KSwgc2VydmVyKTsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJldmlvdXNseSBjYWNoZWQgc2VydmVyLCBpZiBvbmUgZXhpc3RzCi0JICogCi0JICogQHBhcmFtIHR5cGUgdGhlIHNlcnZlciB0eXBlCi0JICogQHBhcmFtIGlzTG9jYWxob3N0IHRydWUgaWYgdGhlIHNlcnZlciBpcyBsb2NhbAotCSAqIEByZXR1cm4gYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldENhY2hlZFNlcnZlcihJU2VydmVyVHlwZSB0eXBlLCBib29sZWFuIGlzTG9jYWxob3N0KSB7Ci0JCXRyeSB7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gY2FjaGUuZ2V0KGdldEtleSh0eXBlLCBpc0xvY2FsaG9zdCkpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjgxYjRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IHNlcnZlciBhbmQgbW9kdWxlIHRhc2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGFza3NDb21wb3NpdGUgZXh0ZW5kcyBTY3JvbGxlZENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCi0JLy8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gc2VsZWN0IGZyb20KLQlwcm90ZWN0ZWQgTGlzdCB0YXNrczsKLQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFza3NDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQotCSAqLwotCXB1YmxpYyBUYXNrc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelRhc2tUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpUYXNrRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSKSk7Ci0JCQotCQkvL2NyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrcyhMaXN0IHRhc2tzKSB7Ci0JCXRoaXMudGFza3MgPSB0YXNrczsKLQkJCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCQljcmVhdGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJaWYgKGNyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCQotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQkKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJc2V0Q29udGVudChjb21wKTsKLQkJVGFza3NMYXlvdXQgbGF5b3V0ID0gbmV3IFRhc2tzTGF5b3V0KFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpKTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9UQVNLX1dJWkFSRCk7Ci0JCQotCQlpbnQgc2l6ZSA9IDA7Ci0JCWlmICh0YXNrcyAhPSBudWxsKQotCQkJc2l6ZSA9IHRhc2tzLnNpemUoKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSB0YXNrcy5nZXQoaSk7Ci0JCQlmaW5hbCBUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvIHN0aSA9IChUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvKSBvYmo7Ci0JCQlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyB8IFNXVC5XUkFQKTsKLQkJCVN0cmluZyBsYWJlbCA9IHN0aS50YXNrMi5nZXRMYWJlbCgpOwotCQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQkJY2hlY2tib3guc2V0VGV4dChsYWJlbCk7Ci0JCQllbHNlCi0JCQkJY2hlY2tib3guc2V0VGV4dChNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOwotCQkKLQkJCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzdGkuc2V0U2VsZWN0ZWQoY2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc3RpLnNldFNlbGVjdGVkKGNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoY29tcCwgU1dULldSQVApOwotCQkJU3RyaW5nIGRlc2MgPSBzdGkudGFzazIuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKLQkJCWVsc2UKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7Ci0JCQkKLQkJCWlmIChzdGkua2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWRlc2NyaXB0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlCi0JCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKHN0aS5pc1NlbGVjdGVkKCkpOwotCQl9Ci0JCQotCQlpZiAoc2l6ZSA9PSAwKQotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiVGFzayBjb21wb3NpdGUgYXBwZWFyZWQgd2l0aCBubyB0YXNrcyEiKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JCQotCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCi0JCXNldE1pblNpemUoY29tcC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJbGF5b3V0KHRydWUsIHRydWUpOwotCQkKLQkJY3JlYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRkNDVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQlwcml2YXRlIGludCB2ZXJ0aWNhbFNwYWNpbmc7Ci0KLQlwdWJsaWMgVGFza3NMYXlvdXQoaW50IHZlcnRpY2FsU3BhY2luZykgewotCQl0aGlzLnZlcnRpY2FsU3BhY2luZyA9IHZlcnRpY2FsU3BhY2luZzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjY29tcHV0ZVNpemUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkvL3JldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQotCQlpbnQgeSA9IDU7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGkgJSAyID09IDApIHsKLQkJCQkJaW50IGggPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQpLnk7Ci0JCQkJCXkgKz0gaCArIHZlcnRpY2FsU3BhY2luZyAvIDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IGggPSBNYXRoLm1heCg0NSwgY2hpbGRyZW5baV0uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxUKS55KTsKLQkJCQkJeSArPSBoICsgdmVydGljYWxTcGFjaW5nOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFBvaW50KDIwMCwgeSk7IC8vICsgdmVydGljYWxTcGFjaW5nKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjbGF5b3V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlSZWN0YW5nbGUgciA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQotCQlpbnQgeSA9IHIueSArIDU7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGkgJSAyID09IDApIHsKLQkJCQkJaW50IGggPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShyLndpZHRoIC0gMTAsIFNXVC5ERUZBVUxUKS55OwotCQkJCQljaGlsZHJlbltpXS5zZXRCb3VuZHMoci54ICsgNSwgeSwgci53aWR0aCAtIDEwLCBoKTsKLQkJCQkJeSArPSBoICsgdmVydGljYWxTcGFjaW5nIC8gMjsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgaCA9IE1hdGgubWF4KDQ1LCBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShyLndpZHRoIC0gMjUsIFNXVC5ERUZBVUxUKS55KTsKLQkJCQkJY2hpbGRyZW5baV0uc2V0Qm91bmRzKHIueCArIDIwLCB5LCByLndpZHRoIC0gMjUsIGgpOwotCQkJCQl5ICs9IGggKyB2ZXJ0aWNhbFNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDUxOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotLyoqCi0gKiBJUnVubmFibGVXaXRoUHJvZ3Jlc3NBZGFwdGVyIHRvIGFsbG93IGl0IHRvIHJ1biBhbiBJV29ya3NwYWNlUnVubmFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCXByaXZhdGUgSVdvcmtzcGFjZVJ1bm5hYmxlIHdvcmtzcGFjZVJ1bm5hYmxlOwotCQotCXB1YmxpYyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIoSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXdvcmtzcGFjZVJ1bm5hYmxlID0gcnVubmFibGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWJhZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGUgc2VydmVyIHRvb2xzIFVJLjwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlclVJQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBmb3IgdGhlIEFQSS4gRnJvbSBoZXJlLCBjbGllbnRzCi1jYW4gZ2V0IHRoZSB3aXphcmQgcGFnZXMgZm9yIGEgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgZ2V0IGEgbGFiZWwKLXByb3ZpZGVyIGZvciBhbGwgc2VydmVyIHR5cGVzLCBvciBsYXVuY2ggUnVuIG9uIFNlcnZlciBkaXJlY3RseS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJVSVV0aWwgcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzLiBDdXJyZW50bHksIHRoaXMgaXMgbGltaXRlZCB0bwotbGF1bmNoaW5nIHRoZSBzZXJ2ZXIgcnVudGltZSB3aXphcmQgYW5kIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc2VydmVyCi1ydW50aW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIgaXMgYSBnZW5lcmljIHNlcnZlciB0b29scyB0YWIgdGhhdCBjYW4KLWJlIHVzZWQgaW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiIGdyb3VwcyBmb3IgYSBzZXJ2ZXIgbGF1bmNoLiBJdCBzaG93cwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlciB0byB0aGUgdXNlci48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzNlMjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5UaGUgc2VydmVyIHRvb2xzIFVJLjwvYWJzdHJhY3Q+Ci0KLTxwPlNlcnZlclVJQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBmb3IgdGhlIEFQSS4gRnJvbSBoZXJlLCBjbGllbnRzCi1jYW4gZ2V0IHRoZSB3aXphcmQgcGFnZXMgZm9yIGEgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgZ2V0IGEgbGFiZWwKLXByb3ZpZGVyIGZvciBhbGwgc2VydmVyIHR5cGVzLCBvciBsYXVuY2ggUnVuIG9uIFNlcnZlciBkaXJlY3RseS48L3A+Ci0KLTxwPlNlcnZlclVJVXRpbCBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMuIEN1cnJlbnRseSwgdGhpcyBpcyBsaW1pdGVkIHRvCi1sYXVuY2hpbmcgdGhlIHNlcnZlciBydW50aW1lIHdpemFyZCBhbmQgZWRpdGluZyBhbiBleGlzdGluZyBzZXJ2ZXIKLXJ1bnRpbWUuPC9wPgotCi08cD5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiIGlzIGEgZ2VuZXJpYyBzZXJ2ZXIgdG9vbHMgdGFiIHRoYXQgY2FuCi1iZSB1c2VkIGluIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYiBncm91cHMgZm9yIGEgc2VydmVyIGxhdW5jaC4gSXQgc2hvd3MKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIgdG8gdGhlIHVzZXIuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL0lXaXphcmRIYW5kbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Yzk3NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL0lXaXphcmRIYW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotLyoqCi0gKiBBIHdpemFyZCBoYW5kbGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkSGFuZGxlIGV4dGVuZHMgSU1lc3NhZ2VQcm92aWRlciB7Ci0JLyoqCi0JICogVXBkYXRlcyB0aGUgd2l6YXJkIGVycm9yIG1lc3NhZ2VzIGFuZCBidXR0b25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgb2YgdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAgCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGUgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpOwotCi0JLyoqCi0JICogVGhlIHBhZ2UncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzYyB0aGUgcGFnZSdzIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpOwotCi0JLyoqCi0JICogVGhlIHBhZ2UncyBpbWFnZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZSB0aGUgcGFnZSdzIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIGltYWdlKTsKLQotCS8qKgotCSAqIFNldCBhbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG5ld01lc3NhZ2UgdGhlIG5ldyBtZXNzYWdlCi0JICogQHBhcmFtIG5ld1R5cGUgdGhlIG5ldyB0eXBlLCBmcm9tIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlLCBpbnQgbmV3VHlwZSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgcnVubmFibGUgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSB3aXphcmQuIFRoaXMgd2lsbCB0eXBpY2FsbHkKLQkgKiBkaXNhYmxlIHRoZSB3aXphcmQgd2hpbGUgdGhlIHJ1bm5hYmxlIGlzIHJ1bm5pbmcsIGFuZCBwcm92aWRlIGEgcHJvZ3Jlc3MKLQkgKiBtb25pdG9yIGZvciB0aGUgdXNlci4gIAotCSAqIAotCSAqIEBwYXJhbSBmb3JrIHRydWUgaWYgYSBzZXBhcmF0ZSB0aHJlYWQgc2hvdWxkIGJlIHVzZWQKLQkgKiBAcGFyYW0gY2FuY2VsYWJsZSB0cnVlIGlmIGl0IHNob3VsZCBiZSBjYW5jZWxhYmxlCi0JICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBydW5uYWJsZQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gdGhyb3duIGlmIGl0IGlzIGludGVycnVwdGVkCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhbiBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL1dpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwZjhlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLS8qKgotICogQSB3aXphcmQgZnJhZ21lbnQgaXMgYSBub2RlIHdpdGhpbiBhIHdpemFyZCB0aGF0IHByb3ZpZGVzIGEgY29tcGxldGVseQotICogZXh0ZW5kYWJsZSB3aXphcmQgZmxvdyBieSBzdXBwb3J0aW5nIGEgZmxleGlibGUgdHJlZSBzdHJ1Y3R1cmUgZm9yIHRoZQotICogcGFnZXMuIEFzIHRoZSB1c2VyIHdhbGtzIHBhZ2VzIHRocm91Z2ggdGhlIHdpemFyZCwgdGhleSBhcmUgYWN0dWFsbHkKLSAqIHRyYXZlcnNpbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSwgYW5kIGVhY2ggbm9kZSBjYW4gYWRkIG9yIHJlbW92ZSBjaGlsZHJlbgotICogYXQgYW55IHRpbWUuCi0gKiAKLSAqIEVhY2ggbm9kZSBtYXkgYmUgbm9uLVVJICh1c2VmdWwgZm9yIGluamVjdGluZyBiZWhhdmlvdXIgaW50byB0aGUgdHJlZSkKLSAqIG9yIGNvbnRhaW4gYSBzaW5nbGUgd2l6YXJkIHBhZ2UgKEBzZWUgaGFzQ29tcG9zaXRlKCkgYW5kCi0gKiBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlLCBJV2l6YXJkSGFuZGxlKSkuIFRoZSBub2RlIG1heSBhbHNvIGhhdmUKLSAqIGNoaWxkcmVuIChAc2VlIGdldENoaWxkRnJhZ21lbnRzKCksIHdoaWNoIHNob3VsZCBiZSB1cGRhdGVkIG9yIHJlZnJlc2hlZAotICogd2hlbmV2ZXIgdGhlIHVwZGF0ZUNoaWxkRnJhZ21lbnRzKCkgbWV0aG9kIGlzIGNhbGxlZCBieSBhbm90aGVyIG5vZGUgdG8KLSAqIGxldCB0aGlzIG5vZGUga25vdyB0aGF0IGl0J3Mgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZC4KLSAqIAotICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgY3JlYXRlQ2hpbGRGcmFnbWVudHMoKSBtZXRob2QgdG8gYWxsb3cgdGhlCi0gKiBmcmFnbWVudCB0byBhZGQgaXQncyBjaGlsZHJlbiBpbnRvIHRoZSB0cmVlLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5Ci0gKiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgdGhlIHRyZWUgaXMgdXBkYXRlZCBhbmQgaXQgbXVzdCByZXR1cm4gdGhlCi0gKiBzYW1lIGluc3RhbmNlIG9mIGFueSBjaGlsZHJlbiB0aGF0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJldHVybmVkLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJpdmF0ZSBUYXNrTW9kZWwgdGFza01vZGVsOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlID0gdHJ1ZTsKLQlwcml2YXRlIExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3RJbXBsOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZyYWdtZW50IGhhcyBhbiBhc3NvY2lhdGVkIFVJLAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGEgY29tcG9zaXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29tcG9zaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZyYWdtZW50LgotCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gaGFzQ29tcG9zaXRlKCkgcmV0dXJucyB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGhhbmRsZSBhIHdpemFyZCBoYW5kbGUKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdpemFyZCB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIEEgdGFzayBtb2RlbCBpcyBzaGFyZWQgYnkgYWxsIGZyYWdtZW50cyBpbiB0aGUgd2l6YXJkIGFuZCBpcyB1c2VkIHRvIHNoYXJlCi0JICogZGF0YS4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiBmcmFnbWVudHMgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgZnJhZ21lbnRzCi0JICogdG8gYmUgY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIGZyYWdtZW50IHRvCi0JICogdGhlIGlucHV0IG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKLQkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhc2sgbW9kZWwKLQkgKiBAc2VlICNzZXRUYXNrTW9kZWwoVGFza01vZGVsKQotCSAqLwotCXB1YmxpYyBUYXNrTW9kZWwgZ2V0VGFza01vZGVsKCkgewotCQlyZXR1cm4gdGFza01vZGVsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaGFzIHRyYXZlcnNlZAotCSAqIGludG8gdGhpcyB3aXphcmQgZnJhZ21lbnQuIEl0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSBmcmFnbWVudCB0aGUKLQkgKiBvcHBvcnR1bml0eSB0byBpbml0aWFsaXplIGFueSB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbXBvc2l0ZSBvcgotCSAqIHVwZGF0ZSB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBXaGVuIGZpbmlzaCBpcyBwcmVzc2VkLCB0aGUgY3VycmVudCBmcmFnbWVudCBpcyBleGl0KCllZCwgYW5kIHRoZW4KLQkgKiBwZXJmb3JtRmluaXNoKCkgaXMgY2FsbGVkIG9uIGFsbCBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSB0cmVlLgotCSAqIGVudGVyKCkgYW5kIGV4aXQoKSBhcmUgbm90IGNhbGxlZCBvbiB0aGUgcmVtYWluaW5nIGZyYWdtZW50cy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGhhcyB0cmF2ZXJzZWQKLQkgKiBvdXQgb2YgdGhpcyB3aXphcmQgZnJhZ21lbnQuIEl0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSBmcmFnbWVudCB0aGUKLQkgKiBvcHBvcnR1bml0eSB0byBzYXZlIGFueSB2YWx1ZXMgZW50ZXJlZCBpbnRvIHRoZSBjb21wb3NpdGUgb3IKLQkgKiB1cGRhdGUgdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogV2hlbiBmaW5pc2ggaXMgcHJlc3NlZCwgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaXMgZXhpdCgpZWQsIGFuZCB0aGVuCi0JICogcGVyZm9ybUZpbmlzaCgpIGlzIGNhbGxlZCBvbiBhbGwgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgdHJlZS4KLQkgKiBlbnRlcigpIGFuZCBleGl0KCkgYXJlIG5vdCBjYWxsZWQgb24gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMuIAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBpcyBmaW5pc2hlZC4KLQkgKiBBZnRlciBleGl0KClpbmcgdGhlIGN1cnJlbnQgcGFnZSwgYWxsIGZyYWdtZW50J3MgcGVyZm9ybUZpbmlzaCgpCi0JICogbWV0aG9kcyBhcmUgY2FsbGVkIGluIG9yZGVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBhbmQgbXVzdCBub3QgYWNjZXNzIHRoZQotCSAqIGNvbXBvc2l0ZS4gTm90IG9ubHkgbWlnaHQgdGhlIHVzZXIgbmV2ZXIgaGF2ZSBhY2Nlc3NlZCB0aGUgZnJhZ21lbnQncwotCSAqIGNvbXBvc2l0ZSwgYnV0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgb24gYSBqb2IKLQkgKiBvbmNlIHRoZSB3aXphcmQgaGFzIGNsb3NlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGlzIGNhbmNlbGVkLgotCSAqIEFmdGVyIGV4aXQoKWluZyB0aGUgY3VycmVudCBwYWdlLCBhbGwgZnJhZ21lbnQncyBwZXJmb3JtQ2FuY2VsKCkKLQkgKiBtZXRob2RzIGFyZSBjYWxsZWQgaW4gb3JkZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkIGFuZCBtdXN0IG5vdCBhY2Nlc3MgdGhlCi0JICogY29tcG9zaXRlLiBOb3Qgb25seSBtaWdodCB0aGUgdXNlciBuZXZlciBoYXZlIGFjY2Vzc2VkIHRoZSBmcmFnbWVudCdzCi0JICogY29tcG9zaXRlLCBidXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBvbiBhIGpvYgotCSAqIG9uY2UgdGhlIHdpemFyZCBoYXMgY2xvc2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUNhbmNlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIGZyYWdtZW50cy4gQ2hpbGQgZnJhZ21lbnRzIGNvbWUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyBmcmFnbWVudAotCSAqIGluIHRoZSB3aXphcmQgZmxvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjaGlsZCBmcmFnbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJaWYgKGxpc3RJbXBsID09IG51bGwpIHsKLQkJCWxpc3RJbXBsID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKLQkJCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJfQotCQlyZXR1cm4gbGlzdEltcGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IGEgY2hhbmNlIHRvIHVwZGF0ZSBpdCdzIGNoaWxkIGZyYWdtZW50cyBpbgotCSAqIHJlc3BvbnNlIHRvIG90aGVyIGNoYW5nZXMgd2l0aGluIHRoZSB3aXphcmQgb3IgdGFzayBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZEZyYWdtZW50cygpIHsKLQkJbGlzdEltcGwgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q2hpbGRGcmFnbWVudHMoKSB0bwotCSAqIGFsbG93IHRoaXMgZnJhZ21lbnQgdG8gYWRkIGl0J3MgY2hpbGRyZW4uIFRoaXMgbWV0aG9kIG11c3QgY2FjaGUgYW5kCi0JICogcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGFueSBjaGlsZCBmcmFnbWVudCBjcmVhdGVkLiBJZiBuZXcKLQkgKiBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgZWFjaCB0aW1lIHRoZSB3aXphcmQgaXMgdXBkYXRlZCwgdGhlIGVuYWJsZW1lbnQKLQkgKiBzdGF0ZSBhbmQgdGhlIGZsb3cgb2YgdGhlIHdpemFyZCB3aWxsIGJlIGluY29ycmVjdC4gCi0JICogCi0JICogQHBhcmFtIGxpc3QgYSBsaXN0IHRvIGFkZCB0aGUgY2hpbGQgZnJhZ21lbnRzIHRvCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgaXMgY29tcGxldGUgKGNhbiBmaW5pc2gpLiBJZiBpdCBpcwotCSAqIGNvbXBsZXRlIHRoZSB1c2VyIHdpbGwgYmUgYWxsb3dlZCB0byBnbyB0byB0aGUgbmV4dCBmcmFnbWVudCBvcgotCSAqIGZpbmlzaCB0aGUgd2l6YXJkLiBJZiB0aGUgZnJhZ21lbnQgaXMgbm90IGNvbXBsZXRlLCB0aGUgTmV4dCBidXR0b24KLQkgKiB3aWxsIGJlIGRpc2FibGVkLiBJZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUgYnV0IGFub3RoZXIgZnJhZ21lbnQKLQkgKiBpcyBub3QgY29tcGxldGUsIHRoZSBGaW5pc2ggYnV0dG9uIHdpbGwgbm90IGJlIGVuYWJsZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlzQ29tcGxldGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGNvbXBsZXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLQkJdGhpcy5pc0NvbXBsZXRlID0gY29tcGxldGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY1N2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPldpemFyZCBhbmQgdGFzayBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPldpemFyZEZyYWdtZW50IGlzIGV4dGVuZGVkIHRvIHByb3ZpZGUgYSBzdWJ0cmVlIG9mIHdpemFyZCBwYWdlcyBvciB0YXNrcwotdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byBhIGxhcmdlciB3aXphcmQgZmxvdy4gVGFza1dpemFyZCBpcyB0aGUgc3RhbmRhcmQKLXdpemFyZCB0aGF0IGtub3dzIGhvdyB0byBoYW5kbGUgV2l6YXJkRnJhZ21lbnRzIGFuZCBkaXNwbGF5IHRoZW0gaW4gb3JkZXIKLXdpdGhpbiBhIHNpbmdsZSB3aXphcmQuIEl0IHVzZXMgdGhlIFRhc2tXaXphcmRQYWdlcyB0byBkaXNwbGF5IHRoZSB3aXphcmQKLWZyYWdtZW50J3MgY29tcG9zaXRlcyB3aXRoaW4gdGhlIHdpemFyZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDMzMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5XaXphcmQgYW5kIHRhc2sgc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L2Fic3RyYWN0PgotCi08cD5XaXphcmRGcmFnbWVudCBpcyBleHRlbmRlZCB0byBwcm92aWRlIGEgc3VidHJlZSBvZiB3aXphcmQgcGFnZXMgb3IgdGFza3MKLXRoYXQgY2FuIGJlIGluc2VydGVkIGludG8gYSBsYXJnZXIgd2l6YXJkIGZsb3cuIFRhc2tXaXphcmQgaXMgdGhlIHN0YW5kYXJkCi13aXphcmQgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIFdpemFyZEZyYWdtZW50cyBhbmQgZGlzcGxheSB0aGVtIGluIG9yZGVyCi13aXRoaW4gYSBzaW5nbGUgd2l6YXJkLiBJdCB1c2VzIHRoZSBUYXNrV2l6YXJkUGFnZXMgdG8gZGlzcGxheSB0aGUgd2l6YXJkCi1mcmFnbWVudCdzIGNvbXBvc2l0ZXMgd2l0aGluIHRoZSB3aXphcmQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=